]> granicus.if.org Git - php/commitdiff
Fix Bug #66736 fpassthru broken
authorMichael Wallner <mike@php.net>
Thu, 3 Apr 2014 08:40:06 +0000 (10:40 +0200)
committerMichael Wallner <mike@php.net>
Thu, 3 Apr 2014 08:40:06 +0000 (10:40 +0200)
NEWS
main/output.c
main/streams/streams.c

diff --git a/NEWS b/NEWS
index bf3fa0c41137c5c4dc9aabdcf312f9edc3719b37..74312280cb6cfc6c37ed601712291f336b32a48d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP                                                                        NEWS
   . Fixed bug #64330 (stream_socket_server() creates wrong Abstract Namespace 
     UNIX sockets). (Mike)
   . Fixed bug #66182 (exit in stream filter produces segfault). (Mike)
+  . Fixed bug #66736 (fpassthru broken). (Mike)
 
 - Embed:
   . Fixed bug #65715 (php5embed.lib isn't provided anymore). (Anatol)
index 0777b64e1d06a661e3db69f3a0344c25669eb93b..e0d33d751f24ec5946c7172b0bc8f55fc4f895e7 100644 (file)
@@ -234,6 +234,13 @@ PHPAPI int php_output_get_status(TSRMLS_D)
  * Unbuffered write */
 PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC)
 {
+#if PHP_DEBUG
+       if (len > UINT_MAX) {
+               php_error(E_WARNING, "Attempt to output more than UINT_MAX bytes at once; "
+                               "output will be truncated %lu => %lu",
+                               (unsigned long) len, (unsigned long) (len % UINT_MAX));
+       }
+#endif
        if (OG(flags) & PHP_OUTPUT_DISABLED) {
                return 0;
        }
@@ -248,6 +255,13 @@ PHPAPI int php_output_write_unbuffered(const char *str, size_t len TSRMLS_DC)
  * Buffered write */
 PHPAPI int php_output_write(const char *str, size_t len TSRMLS_DC)
 {
+#if PHP_DEBUG
+       if (len > UINT_MAX) {
+               php_error(E_WARNING, "Attempt to output more than UINT_MAX bytes at once; "
+                               "output will be truncated %lu => %lu",
+                               (unsigned long) len, (unsigned long) (len % UINT_MAX));
+       }
+#endif
        if (OG(flags) & PHP_OUTPUT_DISABLED) {
                return 0;
        }
index acc67dc2078c3c8066b7a0827cfb959b380912e2..12833771c02ec941b28c9ce5168c97ec9bc537ce 100644 (file)
@@ -1405,11 +1405,16 @@ PHPAPI size_t _php_stream_passthru(php_stream * stream STREAMS_DC TSRMLS_DC)
                p = php_stream_mmap_range(stream, php_stream_tell(stream), PHP_STREAM_MMAP_ALL, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped);
 
                if (p) {
-                       PHPWRITE(p, mapped);
+                       do {
+                               /* output functions return int, so pass in int max */
+                               if (0 < (b = PHPWRITE(p, MIN(mapped - bcount, INT_MAX)))) {
+                                       bcount += b;
+                               }
+                       } while (b > 0 && mapped > bcount);
 
                        php_stream_mmap_unmap_ex(stream, mapped);
 
-                       return mapped;
+                       return bcount;
                }
        }