fix memory leak on resolver query send failure
diff --git a/src/core/ngx_resolver.c b/src/core/ngx_resolver.c
index bbc40ba..e60fbe0 100644
--- a/src/core/ngx_resolver.c
+++ b/src/core/ngx_resolver.c
@@ -453,6 +453,7 @@
/* 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 @@
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 @@
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_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 @@
}
rn->node.key = ctx->addr;
+ rn->query = NULL;
ngx_rbtree_insert(&r->addr_rbtree, &rn->node);
}
@@ -646,6 +654,10 @@
if (rn) {
ngx_rbtree_delete(&r->addr_rbtree, &rn->node);
+ if (rn->query) {
+ ngx_resolver_free(r, rn->query);
+ }
+
ngx_resolver_free(r, rn);
}