return NXDOMAIN for ".." in host name
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index e60fbe0..2763b86 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -369,6 +369,7 @@
{
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_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 @@
len++;
} else {
+ if (len == 0) {
+ return NGX_DECLINED;
+ }
+
*p = (u_char) len;
len = 0;
}