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);