]> git.kaiwu.me - nginx.git/commitdiff
Output chain: free chain links in ngx_chain_writer().
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 23 Mar 2015 18:09:05 +0000 (21:09 +0300)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 23 Mar 2015 18:09:05 +0000 (21:09 +0300)
src/core/ngx_output_chain.c

index 5260c5f666dc57b7f58bf13c3d41c6e0bc109859..252359af67eda734c61e963b1f9dcd06b08ccfda 100644 (file)
@@ -654,7 +654,7 @@ ngx_chain_writer(void *data, ngx_chain_t *in)
     ngx_chain_writer_ctx_t *ctx = data;
 
     off_t              size;
-    ngx_chain_t       *cl;
+    ngx_chain_t       *cl, *ln, *chain;
     ngx_connection_t  *c;
 
     c = ctx->connection;
@@ -734,15 +734,23 @@ ngx_chain_writer(void *data, ngx_chain_t *in)
         return NGX_OK;
     }
 
-    ctx->out = c->send_chain(c, ctx->out, ctx->limit);
+    chain = c->send_chain(c, ctx->out, ctx->limit);
 
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, c->log, 0,
-                   "chain writer out: %p", ctx->out);
+                   "chain writer out: %p", chain);
 
-    if (ctx->out == NGX_CHAIN_ERROR) {
+    if (chain == NGX_CHAIN_ERROR) {
         return NGX_ERROR;
     }
 
+    for (cl = ctx->out; cl && cl != chain; /* void */) {
+        ln = cl;
+        cl = cl->next;
+        ngx_free_chain(ctx->pool, ln);
+    }
+
+    ctx->out = chain;
+
     if (ctx->out == NULL) {
         ctx->last = &ctx->out;