comparison src/core/ngx_resolver.c @ 5582:545a4d393e2f

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.
author Ruslan Ermilov <ru@nginx.com>
date Thu, 20 Feb 2014 17:27:09 +0400
parents d091d16ed398
children 957d734362ed
comparison
equal deleted inserted replaced
5581:4dee5ad51e9e 5582:545a4d393e2f
3035 3035
3036 if (ngx_nonblocking(s) == -1) { 3036 if (ngx_nonblocking(s) == -1) {
3037 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno, 3037 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
3038 ngx_nonblocking_n " failed"); 3038 ngx_nonblocking_n " failed");
3039 3039
3040 ngx_free_connection(c); 3040 goto failed;
3041
3042 if (ngx_close_socket(s) == -1) {
3043 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno,
3044 ngx_close_socket_n " failed");
3045 }
3046
3047 return NGX_ERROR;
3048 } 3041 }
3049 3042
3050 rev = c->read; 3043 rev = c->read;
3051 wev = c->write; 3044 wev = c->write;
3052 3045
3077 3070
3078 if (rc == -1) { 3071 if (rc == -1) {
3079 ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno, 3072 ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno,
3080 "connect() failed"); 3073 "connect() failed");
3081 3074
3082 return NGX_ERROR; 3075 goto failed;
3083 } 3076 }
3084 3077
3085 /* UDP sockets are always ready to write */ 3078 /* UDP sockets are always ready to write */
3086 wev->ready = 1; 3079 wev->ready = 1;
3087 3080
3091 /* kqueue, epoll */ NGX_CLEAR_EVENT: 3084 /* kqueue, epoll */ NGX_CLEAR_EVENT:
3092 /* select, poll, /dev/poll */ NGX_LEVEL_EVENT; 3085 /* select, poll, /dev/poll */ NGX_LEVEL_EVENT;
3093 /* eventport event type has no meaning: oneshot only */ 3086 /* eventport event type has no meaning: oneshot only */
3094 3087
3095 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { 3088 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) {
3096 return NGX_ERROR; 3089 goto failed;
3097 } 3090 }
3098 3091
3099 } else { 3092 } else {
3100 /* rtsig */ 3093 /* rtsig */
3101 3094
3102 if (ngx_add_conn(c) == NGX_ERROR) { 3095 if (ngx_add_conn(c) == NGX_ERROR) {
3103 return NGX_ERROR; 3096 goto failed;
3104 } 3097 }
3105 } 3098 }
3106 3099
3107 return NGX_OK; 3100 return NGX_OK;
3108 } 3101
3102 failed:
3103
3104 ngx_close_connection(c);
3105 uc->connection = NULL;
3106
3107 return NGX_ERROR;
3108 }