]> git.kaiwu.me - nginx.git/commitdiff
fix memory leak on resolver query send failure
authorIgor Sysoev <igor@sysoev.ru>
Wed, 9 Apr 2008 14:26:08 +0000 (14:26 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Wed, 9 Apr 2008 14:26:08 +0000 (14:26 +0000)
src/core/ngx_resolver.c

index bbc40bae0cc8318bf7313fc7923281407b2a0974..e60fbe0055e89d8b0e6800c0d212caeb2aa6a539 100644 (file)
@@ -453,6 +453,7 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
         /* lock alloc mutex */
 
         ngx_resolver_free_locked(r, rn->query);
+        rn->query = NULL;
 
         if (rn->cnlen) {
             ngx_resolver_free_locked(r, rn->u.cname);
@@ -479,6 +480,7 @@ ngx_resolve_name_locked(ngx_resolver_t *r, ngx_resolver_ctx_t *ctx)
 
         rn->node.key = hash;
         rn->nlen = (u_short) ctx->name.len;
+        rn->query = NULL;
 
         ngx_rbtree_insert(&r->name_rbtree, &rn->node);
     }
@@ -526,6 +528,10 @@ failed:
 
     ngx_rbtree_delete(&r->name_rbtree, &rn->node);
 
+    if (rn->query) {
+        ngx_resolver_free(r, rn->query);
+    }
+
     ngx_resolver_free(r, rn->name);
 
     ngx_resolver_free(r, rn);
@@ -588,6 +594,7 @@ ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
         ngx_queue_remove(&rn->queue);
 
         ngx_resolver_free(r, rn->query);
+        rn->query = NULL;
 
     } else {
         rn = ngx_resolver_alloc(r, sizeof(ngx_resolver_node_t));
@@ -596,6 +603,7 @@ ngx_resolve_addr(ngx_resolver_ctx_t *ctx)
         }
 
         rn->node.key = ctx->addr;
+        rn->query = NULL;
 
         ngx_rbtree_insert(&r->addr_rbtree, &rn->node);
     }
@@ -646,6 +654,10 @@ failed:
     if (rn) {
         ngx_rbtree_delete(&r->addr_rbtree, &rn->node);
 
+        if (rn->query) {
+            ngx_resolver_free(r, rn->query);
+        }
+
         ngx_resolver_free(r, rn);
     }