diff options
author | Igor Sysoev <igor@sysoev.ru> | 2008-04-09 14:26:08 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2008-04-09 14:26:08 +0000 |
commit | 949aea4dfe26e300c8e725ffcc8e2ee84f0e5a3a (patch) | |
tree | 8f4d09b0126682016d0bc1f9db76e2928419346c /src/core/ngx_resolver.c | |
parent | f576f0d2bcac29d21a16b440b83c0b32aa121257 (diff) | |
download | nginx-949aea4dfe26e300c8e725ffcc8e2ee84f0e5a3a.tar.gz nginx-949aea4dfe26e300c8e725ffcc8e2ee84f0e5a3a.zip |
fix memory leak on resolver query send failure
Diffstat (limited to 'src/core/ngx_resolver.c')
-rw-r--r-- | src/core/ngx_resolver.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c index bbc40bae0..e60fbe005 100644 --- a/src/core/ngx_resolver.c +++ b/src/core/ngx_resolver.c @@ -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); } |