]> 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 5a944fc797fba84e799b618eb6c439d91c6bbab9..b45001e2d9dcc4cb016a8fc77c04abff109a1c34 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;
     }