Skip to content

Commit

Permalink
Bugfix#75515 php://streams behaving greedily
Browse files Browse the repository at this point in the history
5060fc2 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.
  • Loading branch information
sgolemon committed Nov 13, 2017
1 parent 704bcd3 commit 0a45e8f
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 8 deletions.
10 changes: 4 additions & 6 deletions ext/standard/tests/streams/stream_set_chunk_size.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -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)));
Expand Down Expand Up @@ -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
Expand Down
7 changes: 5 additions & 2 deletions main/streams/streams.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
}
}
Expand Down

0 comments on commit 0a45e8f

Please sign in to comment.