head	1.2;
access;
symbols
	RELEASE_5_4_0:1.1;
locks; strict;
comment	@# @;


1.2
date	2005.04.17.20.38.54;	author clement;	state dead;
branches;
next	1.1;

1.1
date	2005.03.15.22.18.54;	author clement;	state Exp;
branches;
next	;


desc
@@


1.2
log
@- Update to 2.0.54
@
text
@--- include/httpd.h	2005/02/26 08:26:18	155390
+++ include/httpd.h	2005/02/26 09:04:10	155391
@@@@ -1100,6 +1100,7 @@@@
  
 typedef struct core_filter_ctx {
     apr_bucket_brigade *b;
+    apr_bucket_brigade *tmpbb;
 } core_ctx_t;
  
 typedef struct core_net_rec {
--- server/core.c	2005/02/26 08:26:18	155390
+++ server/core.c	2005/02/26 09:04:10	155391
@@@@ -3674,6 +3674,28 @@@@
     } while (!APR_BRIGADE_EMPTY(b) && (e != APR_BRIGADE_SENTINEL(b))); \
 } while (0)
 
+
+/**
+ * Split the contents of a brigade after bucket 'e' to an existing brigade
+ *
+ * XXXX: Should this function be added to APR-Util?
+ */
+static void brigade_move(apr_bucket_brigade *b, apr_bucket_brigade *a,
+                         apr_bucket *e)
+{
+    apr_bucket *f;     
+
+    if (e != APR_BRIGADE_SENTINEL(b)) {
+        f = APR_RING_LAST(&b->list);
+        APR_RING_UNSPLICE(e, f, link);
+        APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link);
+    }
+
+    APR_BRIGADE_CHECK_CONSISTENCY(a);
+    APR_BRIGADE_CHECK_CONSISTENCY(b);
+}
+
+
 static int core_input_filter(ap_filter_t *f, apr_bucket_brigade *b,
                              ap_input_mode_t mode, apr_read_type_e block,
                              apr_off_t readbytes)
@@@@ -3703,6 +3725,7 @@@@
     {
         ctx = apr_pcalloc(f->c->pool, sizeof(*ctx));
         ctx->b = apr_brigade_create(f->c->pool, f->c->bucket_alloc);
+        ctx->tmpbb = apr_brigade_create(ctx->b->p, ctx->b->bucket_alloc);
 
         /* seed the brigade with the client socket. */
         e = apr_bucket_socket_create(net->client_socket, f->c->bucket_alloc);
@@@@ -3814,7 +3837,6 @@@@
     /* read up to the amount they specified. */
     if (mode == AP_MODE_READBYTES || mode == AP_MODE_SPECULATIVE) {
         apr_bucket *e;
-        apr_bucket_brigade *newbb;
 
         AP_DEBUG_ASSERT(readbytes > 0);
 
@@@@ -3855,8 +3877,8 @@@@
             return rv;
         }
 
-        /* Must do split before CONCAT */
-        newbb = apr_brigade_split(ctx->b, e);
+        /* Must do move before CONCAT */
+        brigade_move(ctx->b, ctx->tmpbb, e);
 
         if (mode == AP_MODE_READBYTES) {
             APR_BRIGADE_CONCAT(b, ctx->b);
@@@@ -3873,7 +3895,7 @@@@
         }
 
         /* Take what was originally there and place it back on ctx->b */
-        APR_BRIGADE_CONCAT(ctx->b, newbb);
+        APR_BRIGADE_CONCAT(ctx->b, ctx->tmpbb);
     }
     return APR_SUCCESS;
 }
@


1.1
log
@- Fix memory leak
  *) core_input_filter: Move buckets to a persistent brigade instead of
     creating a new brigade. This stop a memory leak when proxying a
     Streaming Media Server.

Obtained from:  Apache httpd repository
@
text
@@

