changeset 1969:41fd9a2e0755

limit CNAME recursion
author Igor Sysoev <igor@sysoev.ru>
date Sat, 12 Apr 2008 07:29:20 +0000
parents 3c540ad3021f
children 5bb2c374cab2
files src/core/ngx_resolver.c src/core/ngx_resolver.h
diffstat 2 files changed, 26 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -435,10 +435,29 @@ ngx_resolve_name_locked(ngx_resolver_t *
 
             /* NGX_RESOLVE_CNAME */
 
-            ctx->name.len = rn->cnlen;
-            ctx->name.data = rn->u.cname;
-
-            return ngx_resolve_name_locked(r, ctx);
+            if (ctx->recursion++ < NGX_RESOLVER_MAX_RECURSION) {
+
+                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) {
--- a/src/core/ngx_resolver.h
+++ b/src/core/ngx_resolver.h
@@ -29,6 +29,8 @@
 
 #define NGX_NO_RESOLVER       (void *) -1
 
+#define NGX_RESOLVER_MAX_RECURSION    50
+
 
 typedef struct {
     ngx_connection_t         *connection;
@@ -128,6 +130,7 @@ struct ngx_resolver_ctx_s {
     ngx_msec_t                timeout;
 
     ngx_uint_t                quick;  /* unsigned  quick:1; */
+    ngx_uint_t                recursion;
     ngx_event_t              *event;
 };