From 0a45e8f096a04464bda6277c6f3d0b5461737a27 Mon Sep 17 00:00:00 2001 From: Sara Golemon Date: Mon, 13 Nov 2017 06:11:59 -0500 Subject: [PATCH] Bugfix#75515 php://streams behaving greedily 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 | 10 ++++------ main/streams/streams.c | 7 +++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/standard/tests/streams/stream_set_chunk_size.phpt b/ext/standard/tests/streams/stream_set_chunk_size.phpt index 88f4897e93..ce272519c4 100644 --- a/ext/standard/tests/streams/stream_set_chunk_size.phpt +++ b/ext/standard/tests/streams/stream_set_chunk_size.phpt @@ -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 diff --git a/main/streams/streams.c b/main/streams/streams.c index b1099b6fcc..19d08c7978 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -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; } } -- 2.49.0