php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #60120 proc_open hangs with stdin/out with 2048+ bytes
Submitted: 2011-10-24 12:10 UTC Modified: 2011-10-26 08:41 UTC
From: pajoye@php.net Assigned: pajoye (profile)
Status: Closed Package: Filesystem function related
PHP Version: Irrelevant OS: windows
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: pajoye@php.net
New email:
PHP Version: OS:

 

 [2011-10-24 12:10 UTC] pajoye@php.net
Description:
------------
The stream used to read data from stdin/out/err hangs if the data passed is 
getting larger than 2048, under certain circumstances. 

Test script:
---------------
error_reporting(E_ALL);

$cmd = 'php -r "fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);"';
$descriptors = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w'));
$stdin = str_repeat('*', 1024 * 16) . '!';
$stdin = str_repeat('*', 2049 );

$options = array_merge(array('suppress_errors' => true, 'binary_pipes' => true, 'bypass_shell' => false));
$process = proc_open($cmd, $descriptors, $pipes, getcwd(), array(), $options);

foreach ($pipes as $pipe) {
    stream_set_blocking($pipe, false);
}
$writePipes = array($pipes[0]);
$stdinLen = strlen($stdin);
$stdinOffset = 0;

unset($pipes[0]);

while ($pipes || $writePipes) {
    $r = $pipes;
    $w = $writePipes;
    $e = null;
    $n = stream_select($r, $w, $e, 60);

    if (false === $n) {
        break;
    } elseif ($n === 0) {
        proc_terminate($process);

    }
    if ($w) {
        $written = fwrite($writePipes[0], (binary)substr($stdin, $stdinOffset), 8192);
        if (false !== $written) {
            $stdinOffset += $written;
        }
        if ($stdinOffset >= $stdinLen) {
            fclose($writePipes[0]);
            $writePipes = null;
        }
    }

    foreach ($r as $pipe) {
        $type = array_search($pipe, $pipes);
        $data = fread($pipe, 8192);
        if (false === $data || feof($pipe)) {
            fclose($pipe);
            unset($pipes[$type]);
        }
    }
}


Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-10-24 12:10 UTC] pajoye@php.net
-Assigned To: +Assigned To: pajoye
 [2011-10-24 12:39 UTC] pajoye@php.net
Automatic comment from SVN on behalf of pajoye
Revision: http://svn.php.net/viewvc/?view=revision&revision=318366
Log: - fixed bug #60120, proc_open's streams may hang with stdin/out/err when the data exceeds or is equal to 2048 bytes
 [2011-10-26 06:23 UTC] fabien at symfony dot com
AFAIK, this bug has been fixed here: http://svn.php.net/viewvc?
view=revision&revision=318366
 [2011-10-26 08:41 UTC] pajoye@php.net
-Status: Assigned +Status: Closed
 [2011-10-26 08:41 UTC] pajoye@php.net
This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.

 For Windows:

http://windows.php.net/snapshots/
 
Thank you for the report, and for helping us make PHP better.

yes (see the commit tab :), I forgot to close it. Thanks for the headup!
 [2012-02-19 14:34 UTC] nicolas dot sauveur at gmail dot com
On my install of php 5.3.9 (windows 7 wamp server 2, apache 2.2.21), the bug has 
only been fixed for 2048 to 4096 bytes. Above that, proc_open still hangs for me.

I use the same test as above, with
$stdin = str_repeat('*', 4097 );
 [2012-02-19 14:48 UTC] nicolas dot sauveur at gmail dot com
seems similar to https://bugs.php.net/bug.php?id=51800
 [2012-04-18 09:48 UTC] laruence@php.net
Automatic comment on behalf of pajoye
Revision: http://git.php.net/?p=php-src.git;a=commit;h=8bd6b9d87af4ec3953bd760c65aea506c70b840b
Log: - fixed bug #60120, proc_open's streams may hang with stdin/out/err when the data exceeds or is equal to 2048 bytes
 [2012-07-24 23:39 UTC] rasmus@php.net
Automatic comment on behalf of pajoye
Revision: http://git.php.net/?p=php-src.git;a=commit;h=8bd6b9d87af4ec3953bd760c65aea506c70b840b
Log: - fixed bug #60120, proc_open's streams may hang with stdin/out/err when the data exceeds or is equal to 2048 bytes
 [2013-03-16 03:16 UTC] hanskrentel at yahoo dot de
In case you don't want to re-open this issue as not fixed, I made a more specific 
report with 4097+ bytes pipes that cause a hang here:

https://bugs.php.net/bug.php?id=64438
 [2013-11-17 09:35 UTC] laruence@php.net
Automatic comment on behalf of pajoye
Revision: http://git.php.net/?p=php-src.git;a=commit;h=8bd6b9d87af4ec3953bd760c65aea506c70b840b
Log: - fixed bug #60120, proc_open's streams may hang with stdin/out/err when the data exceeds or is equal to 2048 bytes
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 13:01:29 2024 UTC