diff options
author | Igor Sysoev <igor@sysoev.ru> | 2008-04-12 07:29:20 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2008-04-12 07:29:20 +0000 |
commit | a8372d8a840b093398531a63c94f73055e817c2b (patch) | |
tree | e51c2d64afe748ba7b98c3b004fda5fb36008b35 /src/core/ngx_resolver.c | |
parent | 523e09ee1a126176e50d1805cb344c9c9e1761c6 (diff) | |
download | nginx-a8372d8a840b093398531a63c94f73055e817c2b.tar.gz nginx-a8372d8a840b093398531a63c94f73055e817c2b.zip |
limit CNAME recursion
Diffstat (limited to 'src/core/ngx_resolver.c')
-rw-r--r-- | src/core/ngx_resolver.c | 25 |
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) { |