[nginx] Output chain: free chain links in ngx_chain_writer().

Maxim Dounin mdounin at mdounin.ru
Mon Mar 23 18:11:06 UTC 2015


details:   http://hg.nginx.org/nginx/rev/66176dfea01e
branches:  
changeset: 6046:66176dfea01e
user:      Maxim Dounin <mdounin at mdounin.ru>
date:      Mon Mar 23 21:09:05 2015 +0300
description:
Output chain: free chain links in ngx_chain_writer().

diffstat:

 src/core/ngx_output_chain.c |  16 ++++++++++++----
 1 files changed, 12 insertions(+), 4 deletions(-)

diffs (39 lines):

diff --git a/src/core/ngx_output_chain.c b/src/core/ngx_output_chain.c
--- a/src/core/ngx_output_chain.c
+++ b/src/core/ngx_output_chain.c
@@ -654,7 +654,7 @@ ngx_chain_writer(void *data, ngx_chain_t
     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
         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;
 



More information about the nginx-devel mailing list