summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Wallner <mike@php.net>2014-04-03 10:40:20 +0200
committerMichael Wallner <mike@php.net>2014-04-03 10:40:20 +0200
commitbbd25ca01f456ceaa33db234978b4ee2063d20b4 (patch)
treedd542a93e58b9a8a2f94b236b844cdd1bbfa11f2
parentf17fe2cabc1d6875a1eeca4733b793bcbf3e8078 (diff)
parentd08b4dbf23febd3f305a2682b03ab9c70f11ac60 (diff)
downloadphp-git-bbd25ca01f456ceaa33db234978b4ee2063d20b4.tar.gz
Merge branch 'PHP-5.4' into PHP-5.5
* PHP-5.4: Fix Bug #66736 fpassthru broken
-rw-r--r--main/output.c14
-rw-r--r--main/streams/streams.c9
2 files changed, 21 insertions, 2 deletions
diff --git a/main/output.c b/main/output.c
index 72092e9561..1dac7179b8 100644
--- a/main/output.c
+++ b/main/output.c
@@ -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;
}
diff --git a/main/streams/streams.c b/main/streams/streams.c
index 5f467ea6ef..afd2d0a7e1 100644
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -1400,11 +1400,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;
}
}