diff 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
line wrap: on
line diff
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -67,9 +67,9 @@ static void ngx_resolver_read_response(n
 static void ngx_resolver_process_response(ngx_resolver_t *r, u_char *buf,
     size_t n);
 static void ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t n,
-    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t i);
+    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan, ngx_uint_t ans);
 static void ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,
-    ngx_uint_t ident, ngx_uint_t code);
+    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan);
 static ngx_resolver_node_t *ngx_resolver_lookup_name(ngx_resolver_t *r,
     ngx_str_t *name, uint32_t hash);
 static ngx_resolver_node_t *ngx_resolver_lookup_addr(ngx_resolver_t *r,
@@ -884,11 +884,6 @@ ngx_resolver_process_response(ngx_resolv
         goto done;
     }
 
-    if (code == 0 && nan == 0) {
-        err = "no answers in DNS response";
-        goto done;
-    }
-
     i = sizeof(ngx_resolver_query_t);
 
     while (i < (ngx_uint_t) n) {
@@ -934,13 +929,13 @@ found:
     case NGX_RESOLVE_A:
 
         ngx_resolver_process_a(r, buf, n, ident, code, nan,
-                              i + sizeof(ngx_resolver_qs_t));
+                               i + sizeof(ngx_resolver_qs_t));
 
         break;
 
     case NGX_RESOLVE_PTR:
 
-        ngx_resolver_process_ptr(r, buf, n, ident, code);
+        ngx_resolver_process_ptr(r, buf, n, ident, code, nan);
 
         break;
 
@@ -1006,6 +1001,10 @@ ngx_resolver_process_a(ngx_resolver_t *r
         goto failed;
     }
 
+    if (code == 0 && nan == 0) {
+        code = 3; /* NXDOMAIN */
+    }
+
     if (code) {
         next = rn->waiting;
         rn->waiting = NULL;
@@ -1204,6 +1203,8 @@ ngx_resolver_process_a(ngx_resolver_t *r
         ngx_log_debug1(NGX_LOG_DEBUG_CORE, r->log, 0,
                        "resolver cname:\"%V\"", &name);
 
+        ngx_queue_remove(&rn->queue);
+
         rn->cnlen = (u_short) name.len;
         rn->u.cname = name.data;
         rn->valid = ngx_time() + r->valid;
@@ -1250,7 +1251,7 @@ failed:
 
 static void
 ngx_resolver_process_ptr(ngx_resolver_t *r, u_char *buf, size_t n,
-    ngx_uint_t ident, ngx_uint_t code)
+    ngx_uint_t ident, ngx_uint_t code, ngx_uint_t nan)
 {
     char                 *err;
     size_t                len;
@@ -1307,6 +1308,10 @@ ngx_resolver_process_ptr(ngx_resolver_t 
         goto failed;
     }
 
+    if (code == 0 && nan == 0) {
+        code = 3; /* NXDOMAIN */
+    }
+
     if (code) {
         next = rn->waiting;
         rn->waiting = NULL;