diff --git a/NEWS b/NEWS index 50c7c29afe4..d1442272ce9 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,9 @@ PHP NEWS - Session: . Fixed bug #69582 (session not readable by root in CLI). (EvgeniySpinov) +- Standard: + . Fixed bug #69442 (closing of fd incorrect when PTS enabled). (jaytaph) + 19 Jan 2017 PHP 7.0.15 - Core: diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 12d7090ac43..b274dc462b5 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -820,6 +820,12 @@ PHP_FUNCTION(proc_open) } #endif +#if PHP_CAN_DO_PTS + if (dev_ptmx >= 0) { + close(dev_ptmx); + close(slave_pty); + } +#endif /* close those descriptors that we just opened for the parent stuff, * dup new descriptors into required descriptors and close the original * cruft */ @@ -835,13 +841,6 @@ PHP_FUNCTION(proc_open) close(descriptors[i].childend); } -#if PHP_CAN_DO_PTS - if (dev_ptmx >= 0) { - close(dev_ptmx); - close(slave_pty); - } -#endif - if (cwd) { php_ignore_value(chdir(cwd)); } diff --git a/ext/standard/tests/file/bug69442.phpt b/ext/standard/tests/file/bug69442.phpt new file mode 100644 index 00000000000..e5255acb371 --- /dev/null +++ b/ext/standard/tests/file/bug69442.phpt @@ -0,0 +1,46 @@ +--TEST-- +proc_open with PTY closes incorrect file descriptor +--SKIPIF-- +&1", $output); + $output = join("\n", $output); + unlink($tmpFile); + + if (strstr($output, "pty pseudo terminal not supported on this system") !== false) { + die("skip PTY pseudo terminals are not supported"); + } +--FILE-- +/dev/null; code=$?; echo $code >&3; exit $code'; +$descriptors = array(array("pty"), array("pty"), array("pty"), array("pipe", "w")); +$pipes = array(); + +$process = proc_open($cmd, $descriptors, $pipes); + +foreach ($pipes as $type => $pipe) { + $data = fread($pipe, 999); + echo 'type ' . $type . ' '; + var_dump($data); + fclose($pipe); +} +proc_close($process); +--EXPECT-- +type 0 string(5) "foo +" +type 1 string(0) "" +type 2 string(0) "" +type 3 string(3) "42 +" + +