Attached is the patch for bug #22805.

The problem is because the total length of buckets obtained in
each ap_get_brigade call isn't necessarily as long as expected by 
SAPI_POST_READER_FUNC if more data are coming in the stream.

Moriyoshi
Index: sapi/apache2handler/sapi_apache2.c
===================================================================
RCS file: /repository/php4/sapi/apache2handler/sapi_apache2.c,v
retrieving revision 1.1.2.4
diff -u -r1.1.2.4 sapi_apache2.c
--- sapi/apache2handler/sapi_apache2.c  18 Mar 2003 01:24:57 -0000      1.1.2.4
+++ sapi/apache2handler/sapi_apache2.c  21 Mar 2003 21:32:38 -0000
@@ -149,32 +149,41 @@
 static int
 php_apache_sapi_read_post(char *buf, uint count_bytes TSRMLS_DC)
 {
-       apr_size_t len;
+       apr_size_t nbytes_left;
        php_struct *ctx = SG(server_context);
        request_rec *r;
        apr_bucket_brigade *brigade;
        apr_status_t rv;
+       char *ptr;
 
        r = ctx->r;
        brigade = ctx->brigade;
-       len = count_bytes;
+       ptr = buf;
 
-       rv = ap_get_brigade(r->input_filters, brigade, AP_MODE_READBYTES,
-                                               APR_BLOCK_READ, len);
+       for (nbytes_left = (apr_size_t) count_bytes; nbytes_left > 0;) {
+               rv = ap_get_brigade(r->input_filters, brigade, AP_MODE_READBYTES,
+                                                       APR_BLOCK_READ, (apr_off_t) 
nbytes_left);
 
-       if (rv == APR_SUCCESS) {
-               apr_brigade_flatten(brigade, buf, &len);
-       } else {
-               len = 0;
+               if (rv == APR_SUCCESS) {
+                       apr_size_t nbytes_read = nbytes_left;
+
+                       rv = apr_brigade_flatten(brigade, ptr, &nbytes_read);
+
+                       if (rv == APR_SUCCESS) {
+                               ptr += nbytes_read;
+                               nbytes_left -= nbytes_read;
+                       }
+                       apr_brigade_cleanup(brigade);
+
+                       if (nbytes_read == 0) {
+                               break;
+                       }
+               } else {
+                       break;
+               }
        }
 
-       apr_brigade_cleanup(brigade);
-       
-       /* This is downcast is okay, because len is constrained by
-        * count_bytes and we know ap_get_brigade won't return more
-        * than that.
-        */
-       return len;
+       return ((apr_size_t) count_bytes - nbytes_left);
 }
 
 static struct stat*
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to