mirror of
https://github.com/nginx/nginx.git
synced 2024-11-30 18:29:08 +08:00
Merge of r4654, r4672, r4684, r4685, r4692: resolver changes.
*) Resolver: fixed format specification. Patch by Yichun Zhang (agentzh). *) Support for IPv6 literals and an optional port in resolver. *) Fixed crash in ngx_resolver_cleanup_tree(). If sending a DNS request fails with an error (e.g., when mistakenly trying to send it to a local IP broadcast), such a request is not deleted if there are clients waiting on it. However, it was still erroneously removed from the queue. Later ngx_resolver_cleanup_tree() attempted to remove it from the queue again that resulted in a NULL pointer dereference. *) When "resolver" is configured with a domain name, only the first resolved address was used. Now all addresses will be used. *) Fixed segfault with poll and resolver used. Poll event method needs ngx_cycle->files to work, and use of ngx_exit_cycle without files set caused null pointer dereference in resolver's cleanup on udp socket close.
This commit is contained in:
parent
cd8c055e4a
commit
bb612f1336
@ -96,7 +96,7 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
|
||||
{
|
||||
ngx_str_t s;
|
||||
ngx_url_t u;
|
||||
ngx_uint_t i;
|
||||
ngx_uint_t i, j;
|
||||
ngx_resolver_t *r;
|
||||
ngx_pool_cleanup_t *cln;
|
||||
ngx_udp_connection_t *uc;
|
||||
@ -171,29 +171,31 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_str_t *names, ngx_uint_t n)
|
||||
|
||||
ngx_memzero(&u, sizeof(ngx_url_t));
|
||||
|
||||
u.host = names[i];
|
||||
u.port = 53;
|
||||
u.url = names[i];
|
||||
u.default_port = 53;
|
||||
|
||||
if (ngx_inet_resolve_host(cf->pool, &u) != NGX_OK) {
|
||||
if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
|
||||
if (u.err) {
|
||||
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
|
||||
"%s in resolver \"%V\"",
|
||||
u.err, &u.host);
|
||||
u.err, &u.url);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uc = ngx_array_push(&r->udp_connections);
|
||||
uc = ngx_array_push_n(&r->udp_connections, u.naddrs);
|
||||
if (uc == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ngx_memzero(uc, sizeof(ngx_udp_connection_t));
|
||||
ngx_memzero(uc, u.naddrs * sizeof(ngx_udp_connection_t));
|
||||
|
||||
uc->sockaddr = u.addrs->sockaddr;
|
||||
uc->socklen = u.addrs->socklen;
|
||||
uc->server = u.addrs->name;
|
||||
for (j = 0; j < u.naddrs; j++) {
|
||||
uc[j].sockaddr = u.addrs[j].sockaddr;
|
||||
uc[j].socklen = u.addrs[j].socklen;
|
||||
uc[j].server = u.addrs[j].name;
|
||||
}
|
||||
}
|
||||
|
||||
return r;
|
||||
@ -977,12 +979,11 @@ ngx_resolver_resend(ngx_resolver_t *r, ngx_rbtree_t *tree, ngx_queue_t *queue)
|
||||
|
||||
if (rn->waiting) {
|
||||
|
||||
if (ngx_resolver_send_query(r, rn) == NGX_OK) {
|
||||
(void) ngx_resolver_send_query(r, rn);
|
||||
|
||||
rn->expire = now + r->resend_timeout;
|
||||
rn->expire = now + r->resend_timeout;
|
||||
|
||||
ngx_queue_insert_head(queue, &rn->queue);
|
||||
}
|
||||
ngx_queue_insert_head(queue, q);
|
||||
|
||||
continue;
|
||||
}
|
||||
@ -1040,7 +1041,7 @@ ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, size_t n)
|
||||
nan = (query->nan_hi << 8) + query->nan_lo;
|
||||
|
||||
ngx_log_debug6(NGX_LOG_DEBUG_CORE, r->log, 0,
|
||||
"resolver DNS response %ui fl:%04Xui %ui/%ui/%ui/%ui",
|
||||
"resolver DNS response %ui fl:%04Xui %ui/%ui/%ud/%ud",
|
||||
ident, flags, nqs, nan,
|
||||
(query->nns_hi << 8) + query->nns_lo,
|
||||
(query->nar_hi << 8) + query->nar_lo);
|
||||
@ -2189,7 +2190,7 @@ ngx_udp_connect(ngx_udp_connection_t *uc)
|
||||
ngx_socket_t s;
|
||||
ngx_connection_t *c;
|
||||
|
||||
s = ngx_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
s = ngx_socket(uc->sockaddr->sa_family, SOCK_DGRAM, 0);
|
||||
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, &uc->log, 0, "UDP socket %d", s);
|
||||
|
||||
|
@ -711,6 +711,8 @@ ngx_master_process_exit(ngx_cycle_t *cycle)
|
||||
ngx_exit_log.file = &ngx_exit_log_file;
|
||||
|
||||
ngx_exit_cycle.log = &ngx_exit_log;
|
||||
ngx_exit_cycle.files = ngx_cycle->files;
|
||||
ngx_exit_cycle.files_n = ngx_cycle->files_n;
|
||||
ngx_cycle = &ngx_exit_cycle;
|
||||
|
||||
ngx_destroy_pool(cycle->pool);
|
||||
@ -1054,6 +1056,8 @@ ngx_worker_process_exit(ngx_cycle_t *cycle)
|
||||
ngx_exit_log.file = &ngx_exit_log_file;
|
||||
|
||||
ngx_exit_cycle.log = &ngx_exit_log;
|
||||
ngx_exit_cycle.files = ngx_cycle->files;
|
||||
ngx_exit_cycle.files_n = ngx_cycle->files_n;
|
||||
ngx_cycle = &ngx_exit_cycle;
|
||||
|
||||
ngx_destroy_pool(cycle->pool);
|
||||
|
Loading…
Reference in New Issue
Block a user