summaryrefslogtreecommitdiff
path: root/src/core/ngx_resolver.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2007-12-19 16:44:53 +0000
committerJonathan Kolb <jon@b0g.us>2007-12-19 16:44:53 +0000
commit73cd30361418f277067c128cedee4990aa72840b (patch)
tree31543ed1e42e73f4ae58ba4618ce478528ed6b97 /src/core/ngx_resolver.c
parenta877b91668afa1325162965b701bb4268ee870cd (diff)
downloadnginx-73cd30361418f277067c128cedee4990aa72840b.tar.gz
Changes with nginx 0.6.22 19 Dec 2007v0.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.
Diffstat (limited to 'src/core/ngx_resolver.c')
-rw-r--r--src/core/ngx_resolver.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index ab4dcdabc..be0121e2e 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -67,9 +67,9 @@ static void ngx_resolver_read_response(ngx_event_t *rev);
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_resolver_t *r, u_char *buf, size_t n)
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, u_char *buf, size_t last,
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, u_char *buf, size_t last,
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 *r, u_char *buf, size_t n,
goto failed;
}
+ if (code == 0 && nan == 0) {
+ code = 3; /* NXDOMAIN */
+ }
+
if (code) {
next = rn->waiting;
rn->waiting = NULL;