You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by pq...@apache.org on 2005/02/26 10:04:14 UTC
svn commit: r155391 - in httpd/httpd/branches/2.0.x: CHANGES STATUS
include/httpd.h server/core.c
Author: pquerna
Date: Sat Feb 26 01:04:10 2005
New Revision: 155391
URL: http://svn.apache.org/viewcvs?view=rev&rev=155391
Log:
core_input_filter: Stop leaking a brigade by moving buckets to an existing brigade instead of calling brigade_split.
PR: 33382
Reviewed By: Justin Erenkrantz, Jeff Trawick
Modified:
httpd/httpd/branches/2.0.x/CHANGES
httpd/httpd/branches/2.0.x/STATUS
httpd/httpd/branches/2.0.x/include/httpd.h
httpd/httpd/branches/2.0.x/server/core.c
Modified: httpd/httpd/branches/2.0.x/CHANGES
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/2.0.x/CHANGES?view=diff&r1=155390&r2=155391
==============================================================================
--- httpd/httpd/branches/2.0.x/CHANGES (original)
+++ httpd/httpd/branches/2.0.x/CHANGES Sat Feb 26 01:04:10 2005
@@ -1,5 +1,9 @@
Changes with Apache 2.0.54
+ *) 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. PR 33382. [Paul Querna]
+
*) mod_win32: Ignore both PATH_INFO as well as PATH_TRANSLATED to avoid
hiccups from additional path information passed in non-utf-8 format.
[Richard Donkin <rd9 donkin.org]
Modified: httpd/httpd/branches/2.0.x/STATUS
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/2.0.x/STATUS?view=diff&r1=155390&r2=155391
==============================================================================
--- httpd/httpd/branches/2.0.x/STATUS (original)
+++ httpd/httpd/branches/2.0.x/STATUS Sat Feb 26 01:04:10 2005
@@ -94,12 +94,6 @@
identify exactly what the proposed changes are! ]
[ please append new backports at the end of this list not the top. ]
- *) core_input_filter: Fix leak of a brigade by moving buckets to an
- existing brigade instead of calling brigade_split which creates a
- new brigade. PR 33382. r154200
- Patch for 2.0: http://www.apache.org/~pquerna/c-i-f-leak.patch
- +1: pquerna, trawick, jerenkrantz
-
*) mod_ssl: Set r->user from SSLUsername earlier so that it's
actually useful.
http://svn.apache.org/viewcvs.cgi?rev=153280&view=rev
Modified: httpd/httpd/branches/2.0.x/include/httpd.h
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/2.0.x/include/httpd.h?view=diff&r1=155390&r2=155391
==============================================================================
--- httpd/httpd/branches/2.0.x/include/httpd.h (original)
+++ httpd/httpd/branches/2.0.x/include/httpd.h Sat Feb 26 01:04:10 2005
@@ -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 {
Modified: httpd/httpd/branches/2.0.x/server/core.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/branches/2.0.x/server/core.c?view=diff&r1=155390&r2=155391
==============================================================================
--- httpd/httpd/branches/2.0.x/server/core.c (original)
+++ httpd/httpd/branches/2.0.x/server/core.c Sat Feb 26 01:04:10 2005
@@ -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;
}