diff options
author | Ruslan Ermilov <ru@nginx.com> | 2014-02-20 17:27:09 +0400 |
---|---|---|
committer | Ruslan Ermilov <ru@nginx.com> | 2014-02-20 17:27:09 +0400 |
commit | 9ae40c5b5455d717d91dcd620e29da49bbedf644 (patch) | |
tree | d7ff16b25f726e227ca4c35566e7159613941c2b /src/core/ngx_resolver.c | |
parent | c539aaf352f5bf557d9f437105384c5589ec611a (diff) | |
download | nginx-9ae40c5b5455d717d91dcd620e29da49bbedf644.tar.gz nginx-9ae40c5b5455d717d91dcd620e29da49bbedf644.zip |
Resolver: properly handle connect() failures.
If initial attempt to connect() the UDP socket failed, e.g.
due to network unreachable, no further attempts were made.
Diffstat (limited to 'src/core/ngx_resolver.c')
-rw-r--r-- | src/core/ngx_resolver.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c index abf82d85b..7fab50abc 100644 --- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -3037,14 +3037,7 @@ ngx_udp_connect(ngx_udp_connection_t *uc) ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno, ngx_nonblocking_n " failed"); - ngx_free_connection(c); - - if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno, - ngx_close_socket_n " failed"); - } - - return NGX_ERROR; + goto failed; } rev = c->read; @@ -3079,7 +3072,7 @@ ngx_udp_connect(ngx_udp_connection_t *uc) ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno, "connect() failed"); - return NGX_ERROR; + goto failed; } /* UDP sockets are always ready to write */ @@ -3093,16 +3086,23 @@ ngx_udp_connect(ngx_udp_connection_t *uc) /* eventport event type has no meaning: oneshot only */ if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { - return NGX_ERROR; + goto failed; } } else { /* rtsig */ if (ngx_add_conn(c) == NGX_ERROR) { - return NGX_ERROR; + goto failed; } } return NGX_OK; + +failed: + + ngx_close_connection(c); + uc->connection = NULL; + + return NGX_ERROR; } |