Mercurial > hg > nginx-vendor-current
comparison src/core/ngx_resolver.c @ 356:b743d290eb3b NGINX_0_6_22
nginx 0.6.22
*) Change: now all ngx_http_perl_module methods return values copied to
perl's allocated memory.
*) Bugfix: if nginx was built with ngx_http_perl_module, the perl
before 5.8.6 was used, and perl supported threads, then during
reconfiguration the master process aborted; bug appeared in
0.5.9.
Thanks to Boris Zhmurov.
*) Bugfix: the ngx_http_perl_module methods may get invalid values of
the regex captures.
*) Bugfix: a segmentation fault occurred in worker process, if the
$r->has_request_body() method was called for a request whose small
request body was already received.
*) Bugfix: large_client_header_buffers did not freed before going to
keep-alive state.
Thanks to Olexander Shtepa.
*) Bugfix: the last address was missed in the $upstream_addr variable;
bug appeared in 0.6.18.
*) Bugfix: the "fastcgi_catch_stderr" directive did return error code;
now it returns 502 code, that can be rerouted to a next server using
the "fastcgi_next_upstream invalid_header" directive.
*) Bugfix: a segmentation fault occurred in master process if the
"fastcgi_catch_stderr" directive was used; bug appeared in
0.6.10.
Thanks to Manlio Perillo.
author | Igor Sysoev <http://sysoev.ru> |
---|---|
date | Wed, 19 Dec 2007 00:00:00 +0300 |
parents | 583decdb82a4 |
children | 9121a0a91f47 |
comparison
equal
deleted
inserted
replaced
355:3ac45897a61c | 356:b743d290eb3b |
---|---|
65 ngx_queue_t *queue); | 65 ngx_queue_t *queue); |
66 static void ngx_resolver_read_response(ngx_event_t *rev); | 66 static void ngx_resolver_read_response(ngx_event_t *rev); |
67 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, | 67 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf, |
68 size_t n); | 68 size_t n); |
69 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, | 69 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n, |
70 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t i); | 70 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans); |
71 static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, | 71 static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, |
72 ngx_uint_t ident, ngx_uint_t code); | 72 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan); |
73 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r, | 73 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r, |
74 ngx_str_t *name, uint32_t hash); | 74 ngx_str_t *name, uint32_t hash); |
75 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r, | 75 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r, |
76 in_addr_t addr); | 76 in_addr_t addr); |
77 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, | 77 static void ngx_resolver_rbtree_insert_value(ngx_rbtree_node_t *temp, |
882 if (nqs != 1) { | 882 if (nqs != 1) { |
883 err = "invalid number of questions in DNS response"; | 883 err = "invalid number of questions in DNS response"; |
884 goto done; | 884 goto done; |
885 } | 885 } |
886 | 886 |
887 if (code == 0 && nan == 0) { | |
888 err = "no answers in DNS response"; | |
889 goto done; | |
890 } | |
891 | |
892 i = sizeof(ngx_resolver_query_t); | 887 i = sizeof(ngx_resolver_query_t); |
893 | 888 |
894 while (i < (ngx_uint_t) n) { | 889 while (i < (ngx_uint_t) n) { |
895 if (buf[i] == '\0') { | 890 if (buf[i] == '\0') { |
896 goto found; | 891 goto found; |
932 switch (qtype) { | 927 switch (qtype) { |
933 | 928 |
934 case NGX_RESOLVE_A: | 929 case NGX_RESOLVE_A: |
935 | 930 |
936 ngx_resolver_process_a(r, buf, n, ident, code, nan, | 931 ngx_resolver_process_a(r, buf, n, ident, code, nan, |
937 i + sizeof(ngx_resolver_qs_t)); | 932 i + sizeof(ngx_resolver_qs_t)); |
938 | 933 |
939 break; | 934 break; |
940 | 935 |
941 case NGX_RESOLVE_PTR: | 936 case NGX_RESOLVE_PTR: |
942 | 937 |
943 ngx_resolver_process_ptr(r, buf, n, ident, code); | 938 ngx_resolver_process_ptr(r, buf, n, ident, code, nan); |
944 | 939 |
945 break; | 940 break; |
946 | 941 |
947 default: | 942 default: |
948 ngx_log_error(r->log_level, r->log, 0, | 943 ngx_log_error(r->log_level, r->log, 0, |
1004 "wrong ident %d response for %V, expect %d", | 999 "wrong ident %d response for %V, expect %d", |
1005 ident, &name, qident); | 1000 ident, &name, qident); |
1006 goto failed; | 1001 goto failed; |
1007 } | 1002 } |
1008 | 1003 |
1004 if (code == 0 && nan == 0) { | |
1005 code = 3; /* NXDOMAIN */ | |
1006 } | |
1007 | |
1009 if (code) { | 1008 if (code) { |
1010 next = rn->waiting; | 1009 next = rn->waiting; |
1011 rn->waiting = NULL; | 1010 rn->waiting = NULL; |
1012 | 1011 |
1013 ngx_queue_remove(&rn->queue); | 1012 ngx_queue_remove(&rn->queue); |
1202 } | 1201 } |
1203 | 1202 |
1204 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, | 1203 ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0, |
1205 "resolver cname:\"%V\"", &name); | 1204 "resolver cname:\"%V\"", &name); |
1206 | 1205 |
1206 ngx_queue_remove(&rn->queue); | |
1207 | |
1207 rn->cnlen = (u_short) name.len; | 1208 rn->cnlen = (u_short) name.len; |
1208 rn->u.cname = name.data; | 1209 rn->u.cname = name.data; |
1209 rn->valid = ngx_time() + r->valid; | 1210 rn->valid = ngx_time() + r->valid; |
1210 rn->expire = ngx_time() + r->expire; | 1211 rn->expire = ngx_time() + r->expire; |
1211 | 1212 |
1248 } | 1249 } |
1249 | 1250 |
1250 | 1251 |
1251 static void | 1252 static void |
1252 ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, | 1253 ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n, |
1253 ngx_uint_t ident, ngx_uint_t code) | 1254 ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan) |
1254 { | 1255 { |
1255 char *err; | 1256 char *err; |
1256 size_t len; | 1257 size_t len; |
1257 in_addr_t addr; | 1258 in_addr_t addr; |
1258 ngx_int_t digit; | 1259 ngx_int_t digit; |
1305 ident, (addr >> 24) & 0xff, (addr >> 16) & 0xff, | 1306 ident, (addr >> 24) & 0xff, (addr >> 16) & 0xff, |
1306 (addr >> 8) & 0xff, addr & 0xff, qident); | 1307 (addr >> 8) & 0xff, addr & 0xff, qident); |
1307 goto failed; | 1308 goto failed; |
1308 } | 1309 } |
1309 | 1310 |
1311 if (code == 0 && nan == 0) { | |
1312 code = 3; /* NXDOMAIN */ | |
1313 } | |
1314 | |
1310 if (code) { | 1315 if (code) { |
1311 next = rn->waiting; | 1316 next = rn->waiting; |
1312 rn->waiting = NULL; | 1317 rn->waiting = NULL; |
1313 | 1318 |
1314 ngx_queue_remove(&rn->queue); | 1319 ngx_queue_remove(&rn->queue); |