mirror of
https://git.FreeBSD.org/ports.git
synced 2025-01-03 06:04:53 +00:00
- 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
This commit is contained in:
parent
2fbf85fb42
commit
c9adf29fa4
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=131343
@ -9,6 +9,7 @@
|
||||
|
||||
PORTNAME= apache
|
||||
PORTVERSION= 2.0.53
|
||||
PORTREVISION= 1
|
||||
CATEGORIES= www
|
||||
MASTER_SITES= ${MASTER_SITE_APACHE_HTTPD} \
|
||||
${MASTER_SITE_LOCAL:S/%SUBDIR%/clement/}:powerlogo
|
||||
|
77
www/apache2/files/patch-fix-core_input_filter
Normal file
77
www/apache2/files/patch-fix-core_input_filter
Normal file
@ -0,0 +1,77 @@
|
||||
--- 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user