]> git.kaiwu.me - nginx.git/commitdiff
Resolver: fixed use-after-free memory access.
authorRuslan Ermilov <ru@nginx.com>
Thu, 20 Nov 2014 12:24:40 +0000 (15:24 +0300)
committerRuslan Ermilov <ru@nginx.com>
Thu, 20 Nov 2014 12:24:40 +0000 (15:24 +0300)
In 954867a2f0a6, we switched to using resolver node as the
timer event data, so make sure we do not free resolver node
memory until the corresponding timer is deleted.

src/core/ngx_resolver.c

index a17793b13c7e5458641770e3d4f269beaccfe9c4..7aa20ea678d6f58840d318380dcfbdc4a38ed761 100644 (file)
@@ -1568,8 +1568,6 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
 
         ngx_rbtree_delete(&r->name_rbtree, &rn->node);
 
-        ngx_resolver_free_node(r, rn);
-
         /* unlock name mutex */
 
         while (next) {
@@ -1580,6 +1578,8 @@ ngx_resolver_process_a(ngx_resolver_t *r, u_char *buf, size_t last,
             ctx->handler(ctx);
         }
 
+        ngx_resolver_free_node(r, rn);
+
         return;
     }
 
@@ -2143,8 +2143,6 @@ valid:
 
         ngx_rbtree_delete(tree, &rn->node);
 
-        ngx_resolver_free_node(r, rn);
-
         /* unlock addr mutex */
 
         while (next) {
@@ -2155,6 +2153,8 @@ valid:
             ctx->handler(ctx);
         }
 
+        ngx_resolver_free_node(r, rn);
+
         return;
     }