]> git.kaiwu.me - nginx.git/commitdiff
limit CNAME recursion
authorIgor Sysoev <igor@sysoev.ru>
Sat, 12 Apr 2008 07:29:20 +0000 (07:29 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Sat, 12 Apr 2008 07:29:20 +0000 (07:29 +0000)
src/core/ngx_resolver.c
src/core/ngx_resolver.h

index 47e43ab2451d4ec0a10c55a7d8a0013e5e69814c..a5b8efbf6754d3122cab9c02d279ec0b3c088cbe 100644 (file)
@@ -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) {
index 0086d6ae865789d6085ef69fcd25d669b34d792f..6c4afac97cb745ceadb11172a7f9cb3883297c13 100644 (file)
@@ -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;
 };