summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-01-30 11:12:52 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-01-30 11:12:52 +0000
commit4a23bc57051187362094c1f41793901805ac55c2 (patch)
tree812f310b9cb5392d8e593e861fa6696d75ef827d /src
parentb06200f3dc071a60ceadbfc65577086ba4626cbd (diff)
downloadnginx-4a23bc57051187362094c1f41793901805ac55c2.tar.gz
nginx-4a23bc57051187362094c1f41793901805ac55c2.tar.bz2
Fixed error handling in ngx_event_connect_peer().
Previously if ngx_add_event() failed a connection was freed two times (once in the ngx_event_connect_peer(), and again by a caller) as pc->connection was left set. Fix is to always use ngx_close_connection() to close connection properly and set pc->connection to NULL on errors. Patch by Piotr Sikora.
Diffstat (limited to 'src')
-rw-r--r--src/event/ngx_event_connect.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c
index d501b2e53..978f39b42 100644
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -160,6 +160,9 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
ngx_log_error(level, c->log, err, "connect() to %V failed",
pc->name);
+ ngx_close_connection(c);
+ pc->connection = NULL;
+
return NGX_DECLINED;
}
}
@@ -241,12 +244,8 @@ ngx_event_connect_peer(ngx_peer_connection_t *pc)
failed:
- ngx_free_connection(c);
-
- if (ngx_close_socket(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
- ngx_close_socket_n " failed");
- }
+ ngx_close_connection(c);
+ pc->connection = NULL;
return NGX_ERROR;
}