]> git.kaiwu.me - nginx.git/commitdiff
Core: moved logging before freeing large blocks of pool.
authorValentin Bartenev <vbart@nginx.com>
Wed, 23 Mar 2016 14:44:04 +0000 (17:44 +0300)
committerValentin Bartenev <vbart@nginx.com>
Wed, 23 Mar 2016 14:44:04 +0000 (17:44 +0300)
This fixes use-after-free memory access with enabled debug log
when pool->log is allocated as a large block.

src/core/ngx_palloc.c

index ef4a64771445ecebd7fcc5ce8e71500abfd5a523..48a76d978c7b1f4b72198890917ef7654316ad07 100644 (file)
@@ -56,15 +56,6 @@ ngx_destroy_pool(ngx_pool_t *pool)
         }
     }
 
-    for (l = pool->large; l; l = l->next) {
-
-        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
-
-        if (l->alloc) {
-            ngx_free(l->alloc);
-        }
-    }
-
 #if (NGX_DEBUG)
 
     /*
@@ -72,6 +63,10 @@ ngx_destroy_pool(ngx_pool_t *pool)
      * so we cannot use this log while free()ing the pool
      */
 
+    for (l = pool->large; l; l = l->next) {
+        ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
+    }
+
     for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
         ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
                        "free: %p, unused: %uz", p, p->d.end - p->d.last);
@@ -83,6 +78,12 @@ ngx_destroy_pool(ngx_pool_t *pool)
 
 #endif
 
+    for (l = pool->large; l; l = l->next) {
+        if (l->alloc) {
+            ngx_free(l->alloc);
+        }
+    }
+
     for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {
         ngx_free(p);