]> granicus.if.org Git - php/commitdiff
Bugfix#75515 php://streams behaving greedily
authorSara Golemon <pollita@php.net>
Mon, 13 Nov 2017 11:11:59 +0000 (06:11 -0500)
committerSara Golemon <pollita@php.net>
Mon, 13 Nov 2017 14:40:34 +0000 (09:40 -0500)
5060fc23 attempted to fix #68948 by treating all non-uri streams
as non-blocking, however php://fd/* streams (which includes stdin)
may block if the other end of the IPC isn't finished.

This represents a partial revert to the pre RC6 state,
but includes an escape hatch for php://memory and php://temp
streams which are local to the current process.

This also restores stream_set_chunk_size test to previous state.

ext/standard/tests/streams/stream_set_chunk_size.phpt
main/streams/streams.c

index 88f4897e9389fd432883a5ae118e19a0dd805192..ce272519c4c96fd33e53f46baa7e536ebd224cdb 100644 (file)
@@ -39,7 +39,7 @@ var_dump(fwrite($f, str_repeat('b', 3)));
 
 echo "should return previous chunk size (1)\n";
 var_dump(stream_set_chunk_size($f, 100));
-echo "should elicit 3 reads of size 100 (chunk size)\n";
+echo "should elicit one read of size 100 (chunk size)\n";
 var_dump(strlen(fread($f, 250)));
 echo "should elicit one read of size 100 (chunk size)\n";
 var_dump(strlen(fread($f, 50)));
@@ -67,15 +67,13 @@ write with size: 1
 int(3)
 should return previous chunk size (1)
 int(1)
-should elicit 3 reads of size 100 (chunk size)
-read with size: 100
-read with size: 100
+should elicit one read of size 100 (chunk size)
 read with size: 100
-int(250)
+int(100)
 should elicit one read of size 100 (chunk size)
+read with size: 100
 int(50)
 should elicit no read because there is sufficient cached data
-read with size: 100
 int(50)
 should elicit 2 writes of size 100 and one of size 50
 write with size: 100
index b1099b6fcc377e5e8b49ba9978a7192459b87106..19d08c797896a6debfc2b3e5b1ec8b4909c1e883 100644 (file)
@@ -24,6 +24,7 @@
 #define _GNU_SOURCE
 #include "php.h"
 #include "php_globals.h"
+#include "php_memory_streams.h"
 #include "php_network.h"
 #include "php_open_temporary_file.h"
 #include "ext/standard/file.h"
@@ -709,8 +710,10 @@ PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t size)
                        break;
                }
 
-               /* just break anyway, to avoid greedy read */
-               if (!stream->wrapper || stream->wrapper->is_url) {
+               /* just break anyway, to avoid greedy read for file://, php://memory, and php://temp */
+               if ((stream->wrapper != &php_plain_files_wrapper) &&
+                       (stream->ops != &php_stream_memory_ops) &&
+                       (stream->ops != &php_stream_temp_ops)) {
                        break;
                }
        }