stas 2004/03/03 01:08:19
Modified: src/modules/perl modperl_filter.c
Log:
the new modperl_cgi_header_parse version now takes care of using only the
'len' bytes of the passed buffer, so we no longer need to copy those bytes
into a new buffer.
Revision Changes Path
1.85 +4 -22 modperl-2.0/src/modules/perl/modperl_filter.c
Index: modperl_filter.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_filter.c,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -u -r1.84 -r1.85
--- modperl_filter.c 3 Mar 2004 06:05:30 -0000 1.84
+++ modperl_filter.c 3 Mar 2004 09:08:19 -0000 1.85
@@ -112,7 +112,6 @@
apr_bucket_alloc_t *ba = (*wb->filters)->c->bucket_alloc;
apr_bucket_brigade *bb;
apr_bucket *bucket;
- const char *work_buf = buf;
/* reset the counter to 0 as early as possible and in one place,
* since this function will always either pass the data out (and
@@ -125,27 +124,10 @@
const char *body;
int status;
- /*
- * since wb->outbuf is persistent between requests, if the
- * current response is shorter than the size of wb->outbuf
- * it may include data from the previous request at the
- * end. When this function receives a pointer to
- * wb->outbuf as 'buf', modperl_cgi_header_parse may
- * return that irrelevant data as part of 'body'. So
- * to avoid this risk, we create a new buffer of size 'len'
- * XXX: if buf wasn't 'const char *buf' we could simply do
- * buf[len] = '\0'
- */
- /* MP_IOBUFSIZE is the size of wb->outbuf */
- if (buf == wb->outbuf && len < MP_IOBUFSIZE) {
- work_buf = (char *)apr_pcalloc(wb->pool, sizeof(char*)*len);
- memcpy((void*)work_buf, buf, len);
- }
-
MP_TRACE_f(MP_FUNC, "\n\n\tparsing headers: %d bytes [%s]\n", len,
- apr_pstrmemdup(wb->pool, work_buf, len));
+ apr_pstrmemdup(wb->pool, buf, len));
- status = modperl_cgi_header_parse(r, (char *)work_buf, &len, &body);
+ status = modperl_cgi_header_parse(r, (char *)buf, &len, &body);
wb->header_parse = 0; /* only once per-request */
@@ -164,11 +146,11 @@
return APR_SUCCESS;
}
- work_buf = body;
+ buf = body;
}
bb = apr_brigade_create(wb->pool, ba);
- bucket = apr_bucket_transient_create(work_buf, len, ba);
+ bucket = apr_bucket_transient_create(buf, len, ba);
APR_BRIGADE_INSERT_TAIL(bb, bucket);
if (add_flush_bucket) {