mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5: NEWS Fixed bug #61019 (Out of memory on command stream_get_contents)
This commit is contained in:
commit
68c57f8149
2 changed files with 82 additions and 0 deletions
78
ext/standard/tests/streams/bug61019.phpt
Normal file
78
ext/standard/tests/streams/bug61019.phpt
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
--TEST--
|
||||||
|
Bug #61019 (Out of memory on command stream_get_contents)
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
echo "Test\n";
|
||||||
|
|
||||||
|
$descriptorspec = array(
|
||||||
|
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
|
||||||
|
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
|
||||||
|
2 => array("pipe", "w") // stderr is a pipe that the child will write to
|
||||||
|
);
|
||||||
|
|
||||||
|
$process=proc_open("echo testtext",$descriptorspec,$pipes);
|
||||||
|
if(is_resource($process))
|
||||||
|
{
|
||||||
|
stream_set_blocking($pipes[0],false);
|
||||||
|
stream_set_blocking($pipes[1],false);
|
||||||
|
stream_set_blocking($pipes[2],false);
|
||||||
|
stream_set_write_buffer($pipes[0],0);
|
||||||
|
stream_set_read_buffer($pipes[1],0);
|
||||||
|
stream_set_read_buffer($pipes[2],0);
|
||||||
|
$stdin_stream="";
|
||||||
|
$stderr_stream="";
|
||||||
|
|
||||||
|
echo "External command executed\n";
|
||||||
|
do
|
||||||
|
{
|
||||||
|
$process_state=proc_get_status($process);
|
||||||
|
$tmp_stdin=stream_get_contents($pipes[1]);
|
||||||
|
if($tmp_stdin)
|
||||||
|
{
|
||||||
|
$stdin_stream=$stdin_stream.$tmp_stdin;
|
||||||
|
}
|
||||||
|
$tmp_stderr=stream_get_contents($pipes[2]);
|
||||||
|
if($tmp_stderr)
|
||||||
|
{
|
||||||
|
$stderr_stream=$stderr_stream.$tmp_stderr;
|
||||||
|
}
|
||||||
|
} while($process_state['running']);
|
||||||
|
|
||||||
|
echo "External command exit: ".$process_state['exitcode']."\n";
|
||||||
|
|
||||||
|
//read outstanding data
|
||||||
|
$tmp_stdin=stream_get_contents($pipes[1]);
|
||||||
|
if($tmp_stdin)
|
||||||
|
{
|
||||||
|
$stdin_stream=$stdin_stream.$tmp_stdin;
|
||||||
|
}
|
||||||
|
$tmp_stderr=stream_get_contents($pipes[2]);
|
||||||
|
if($tmp_stderr)
|
||||||
|
{
|
||||||
|
$stderr_stream=$stderr_stream.$tmp_stderr;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose ($pipes[0]);
|
||||||
|
fclose ($pipes[1]);
|
||||||
|
fclose ($pipes[2]);
|
||||||
|
|
||||||
|
proc_close($process);
|
||||||
|
|
||||||
|
echo "STDOUT: ".$stdin_stream."\n";
|
||||||
|
echo "STDERR: ".$stderr_stream."\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo "Can't start external command\n";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
===DONE===
|
||||||
|
--EXPECT--
|
||||||
|
Test
|
||||||
|
External command executed
|
||||||
|
External command exit: 0
|
||||||
|
STDOUT: testtext
|
||||||
|
|
||||||
|
STDERR:
|
||||||
|
===DONE===
|
|
@ -731,6 +731,10 @@ PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t size TSRMLS
|
||||||
|
|
||||||
if (!stream->readfilters.head && (stream->flags & PHP_STREAM_FLAG_NO_BUFFER || stream->chunk_size == 1)) {
|
if (!stream->readfilters.head && (stream->flags & PHP_STREAM_FLAG_NO_BUFFER || stream->chunk_size == 1)) {
|
||||||
toread = stream->ops->read(stream, buf, size TSRMLS_CC);
|
toread = stream->ops->read(stream, buf, size TSRMLS_CC);
|
||||||
|
if (toread == (size_t) -1) {
|
||||||
|
/* e.g. underlying read(2) returned -1 */
|
||||||
|
break;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
php_stream_fill_read_buffer(stream, size TSRMLS_CC);
|
php_stream_fill_read_buffer(stream, size TSRMLS_CC);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue