diff options
author | Igor Sysoev <igor@sysoev.ru> | 2008-04-09 14:45:39 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2008-04-09 14:45:39 +0000 |
commit | 09b199cf777f8aa145c290fa898f00b819c1fc95 (patch) | |
tree | 6997f089313ee785ca9b942150f9c4ddbd908780 /src | |
parent | 949aea4dfe26e300c8e725ffcc8e2ee84f0e5a3a (diff) | |
download | nginx-09b199cf777f8aa145c290fa898f00b819c1fc95.tar.gz nginx-09b199cf777f8aa145c290fa898f00b819c1fc95.zip |
return NXDOMAIN for ".." in host name
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ngx_resolver.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c index e60fbe005..2763b8694 100644 --- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -369,6 +369,7 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx) { uint32_t hash; in_addr_t addr, *addrs; + ngx_int_t rc; ngx_uint_t naddrs; ngx_resolver_ctx_t *next; ngx_resolver_node_t *rn; @@ -485,10 +486,25 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx) ngx_rbtree_insert(&r->name_rbtree, &rn->node); } - if (ngx_resolver_create_name_query(rn, ctx) != NGX_OK) { + rc = ngx_resolver_create_name_query(rn, ctx); + + if (rc == NGX_ERROR) { goto failed; } + if (rc == NGX_DECLINED) { + ngx_rbtree_delete(&r->name_rbtree, &rn->node); + + ngx_resolver_free(r, rn->query); + ngx_resolver_free(r, rn->name); + ngx_resolver_free(r, rn); + + ctx->state = NGX_RESOLVE_NXDOMAIN; + ctx->handler(ctx); + + return NGX_OK; + } + if (ngx_resolver_send_query(r, rn) != NGX_OK) { goto failed; } @@ -1696,6 +1712,10 @@ ngx_resolver_create_name_query(ngx_resolver_node_t *rn, ngx_resolver_ctx_t *ctx) len++; } else { + if (len == 0) { + return NGX_DECLINED; + } + *p = (u_char) len; len = 0; } |