jerenkrantz 2003/12/26 22:53:13
Modified: modules/dav/main Tag: APACHE_2_0_BRANCH mod_dav.c
. Tag: APACHE_2_0_BRANCH CHANGES
Log:
use bucket brigades directly when reading PUT data. This avoids
problems with content-length-modifying input filter (like deflate).
revision 1.99:
drop the test, whether apr_brigade_create returns NULL. It does never
(dumps core instead :-)
Submitted by: Cliff Woolley
revision 1.100:
get rid of _FOREACH
Submitted by: Cliff Woolley
(Needed 1.100 too as APR_BRIGADE_FOREACH is now gone in APR-util 1.0+.)
Backport of modules/dav/main/mod_dav.c r1.98, r1.99, r1.100
PR: 22104
Some stuff submitted by: tim@robbins.dropbear.id.au (Tim Robbins)
Reviewed by: André Malo, Jeff Trawick, Justin Erenkrantz
Revision Changes Path
No revision
No revision
1.91.2.5 +49 -36 httpd-2.0/modules/dav/main/mod_dav.c
Index: mod_dav.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/dav/main/mod_dav.c,v
retrieving revision 1.91.2.4
retrieving revision 1.91.2.5
diff -u -u -r1.91.2.4 -r1.91.2.5
--- mod_dav.c 27 Dec 2003 06:03:44 -0000 1.91.2.4
+++ mod_dav.c 27 Dec 2003 06:53:12 -0000 1.91.2.5
@@ -896,7 +896,6 @@
const char *body;
dav_error *err;
dav_error *err2;
- int result;
dav_stream_mode mode;
dav_stream *stream;
dav_response *multi_response;
@@ -904,10 +903,6 @@
apr_off_t range_start;
apr_off_t range_end;
- if ((result = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) != OK) {
- return result;
- }
-
/* Ask repository module to resolve the resource */
err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */,
&resource);
@@ -982,40 +977,58 @@
}
if (err == NULL) {
- if (ap_should_client_block(r)) {
- char *buffer = apr_palloc(r->pool, DAV_READ_BLOCKSIZE);
- long len;
-
- /*
- * Once we start reading the request, then we must read the
- * whole darn thing. ap_discard_request_body() won't do anything
- * for a partially-read request.
- */
-
- while ((len = ap_get_client_block(r, buffer,
- DAV_READ_BLOCKSIZE)) > 0) {
- if (err == NULL) {
- /* write whatever we read, until we see an error */
- err = (*resource->hooks->write_stream)(stream,
- buffer, len);
- }
+ apr_bucket_brigade *bb;
+ apr_bucket *b;
+ int seen_eos = 0;
+
+ bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
+
+ do {
+ apr_status_t rc;
+
+ rc = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES,
+ APR_BLOCK_READ, DAV_READ_BLOCKSIZE);
+
+ if (rc != APR_SUCCESS) {
+ err = dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0,
+ "Could not get next bucket brigade");
+ break;
}
- /*
- * ### what happens if we read more/less than the amount
- * ### specified in the Content-Range? eek...
- */
-
- if (len == -1) {
- /*
- * Error reading request body. This has precedence over
- * prior errors.
- */
- err = dav_new_error(r->pool, HTTP_BAD_REQUEST, 0,
- "An error occurred while reading the "
- "request body.");
+ for (b = APR_BRIGADE_FIRST(bb);
+ b != APR_BRIGADE_SENTINEL(bb);
+ b = APR_BUCKET_NEXT(b))
+ {
+ const char *data;
+ apr_size_t len;
+
+ if (APR_BUCKET_IS_EOS(b)) {
+ seen_eos = 1;
+ break;
+ }
+
+ if (APR_BUCKET_IS_METADATA(b)) {
+ continue;
+ }
+
+ rc = apr_bucket_read(b, &data, &len, APR_BLOCK_READ);
+ if (rc != APR_SUCCESS) {
+ err = dav_new_error(r->pool, HTTP_BAD_REQUEST, 0,
+ "An error occurred while reading "
+ "the request body.");
+ break;
+ }
+
+ if (err == NULL) {
+ /* write whatever we read, until we see an error */
+ err = (*resource->hooks->write_stream)(stream, data, len);
+ }
}
- }
+
+ apr_brigade_cleanup(bb);
+ } while (!seen_eos);
+
+ apr_brigade_destroy(bb);
err2 = (*resource->hooks->close_stream)(stream,
err == NULL /* commit */);
No revision
No revision
1.988.2.205 +4 -0 httpd-2.0/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/httpd-2.0/CHANGES,v
retrieving revision 1.988.2.204
retrieving revision 1.988.2.205
diff -u -u -r1.988.2.204 -r1.988.2.205
--- CHANGES 27 Dec 2003 06:39:53 -0000 1.988.2.204
+++ CHANGES 27 Dec 2003 06:53:12 -0000 1.988.2.205
@@ -1,5 +1,9 @@
Changes with Apache 2.0.49
+ *) mod_dav: Use bucket brigades when reading PUT data. This avoids
+ problems if the data stream is modified by an input filter. PR 22104.
+ [Tim Robbins <tim robbins.dropbear.id.au>, André Malo]
+
*) Fix RewriteBase directive to not add double slashes. [André Malo]
*) Improve 'configure --help' output for some modules. [Astrid Keßler]
|