aboutsummaryrefslogtreecommitdiff
path: root/src/core/ngx_resolver.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2008-04-12 07:29:20 +0000
committerIgor Sysoev <igor@sysoev.ru>2008-04-12 07:29:20 +0000
commita8372d8a840b093398531a63c94f73055e817c2b (patch)
treee51c2d64afe748ba7b98c3b004fda5fb36008b35 /src/core/ngx_resolver.c
parent523e09ee1a126176e50d1805cb344c9c9e1761c6 (diff)
downloadnginx-a8372d8a840b093398531a63c94f73055e817c2b.tar.gz
nginx-a8372d8a840b093398531a63c94f73055e817c2b.zip
limit CNAME recursion
Diffstat (limited to 'src/core/ngx_resolver.c')
-rw-r--r--src/core/ngx_resolver.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index 47e43ab24..a5b8efbf6 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -435,10 +435,29 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
/* NGX_RESOLVE_CNAME */
- ctx->name.len = rn->cnlen;
- ctx->name.data = rn->u.cname;
+ if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) {
- return ngx_resolve_name_locked(r, ctx);
+ ctx->name.len = rn->cnlen;
+ ctx->name.data = rn->u.cname;
+
+ return ngx_resolve_name_locked(r, ctx);
+ }
+
+ ctx->next = rn->waiting;
+ rn->waiting = NULL;
+
+ /* unlock name mutex */
+
+ do {
+ ctx->state = NGX_RESOLVE_NXDOMAIN;
+ next = ctx->next;
+
+ ctx->handler(ctx);
+
+ ctx = next;
+ } while (ctx);
+
+ return NGX_OK;
}
if (rn->waiting) {