Annotation of embedaddon/php/ext/standard/tests/file/bug60120.phpt, revision 1.1.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>