Annotation of embedaddon/php/ext/standard/tests/file/bug60120.phpt, revision 1.1
1.1 ! misho 1: --TEST--
! 2: Bug #60120 (proc_open hangs when data in stdin/out/err is getting larger or equal to 2048)
! 3: --SKIPIF--
! 4: <?php
! 5: if (substr(PHP_OS, 0, 3) != 'WIN') {
! 6: die('skip only for Windows');
! 7: }
! 8: $php = getenv('TEST_PHP_EXECUTABLE');
! 9: if (!$php) {
! 10: die("No php executable defined\n");
! 11: }
! 12: ?>
! 13: --FILE--
! 14: <?php
! 15:
! 16: error_reporting(E_ALL);
! 17:
! 18: $php = getenv('TEST_PHP_EXECUTABLE');
! 19: if (!$php) {
! 20: die("No php executable defined\n");
! 21: }
! 22: $cmd = 'php -r "fwrite(STDOUT, $in = file_get_contents(\'php://stdin\')); fwrite(STDERR, $in);"';
! 23: $descriptors = array(array('pipe', 'r'), array('pipe', 'w'), array('pipe', 'w'));
! 24: $stdin = str_repeat('*', 1024 * 16) . '!';
! 25: $stdin = str_repeat('*', 2049 );
! 26:
! 27: $options = array_merge(array('suppress_errors' => true, 'binary_pipes' => true, 'bypass_shell' => false));
! 28: $process = proc_open($cmd, $descriptors, $pipes, getcwd(), array(), $options);
! 29:
! 30: foreach ($pipes as $pipe) {
! 31: stream_set_blocking($pipe, false);
! 32: }
! 33: $writePipes = array($pipes[0]);
! 34: $stdinLen = strlen($stdin);
! 35: $stdinOffset = 0;
! 36:
! 37: unset($pipes[0]);
! 38:
! 39: while ($pipes || $writePipes) {
! 40: $r = $pipes;
! 41: $w = $writePipes;
! 42: $e = null;
! 43: $n = stream_select($r, $w, $e, 60);
! 44:
! 45: if (false === $n) {
! 46: break;
! 47: } elseif ($n === 0) {
! 48: proc_terminate($process);
! 49:
! 50: }
! 51: if ($w) {
! 52: $written = fwrite($writePipes[0], (binary)substr($stdin, $stdinOffset), 8192);
! 53: if (false !== $written) {
! 54: $stdinOffset += $written;
! 55: }
! 56: if ($stdinOffset >= $stdinLen) {
! 57: fclose($writePipes[0]);
! 58: $writePipes = null;
! 59: }
! 60: }
! 61:
! 62: foreach ($r as $pipe) {
! 63: $type = array_search($pipe, $pipes);
! 64: $data = fread($pipe, 8192);
! 65: if (false === $data || feof($pipe)) {
! 66: fclose($pipe);
! 67: unset($pipes[$type]);
! 68: }
! 69: }
! 70: }
! 71: echo "OK.";
! 72: ?>
! 73: --EXPECT--
! 74: OK.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>