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