]> granicus.if.org Git - php/commitdiff
Fixed bug #34794 (proc_close() hangs when used with two processes)
authorNuno Lopes <nlopess@php.net>
Tue, 13 Feb 2007 19:53:42 +0000 (19:53 +0000)
committerNuno Lopes <nlopess@php.net>
Tue, 13 Feb 2007 19:53:42 +0000 (19:53 +0000)
NEWS
ext/standard/proc_open.c
ext/standard/tests/general_functions/bug34794.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index aeb5c4464588ad54d533fbfaf318f9583b07543d..279fd84b5a4d7c070cfa1462c654f646810bfebf 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,8 @@ PHP                                                                        NEWS
 - Fixed bug #40109 (iptcembed fails on non-jfif jpegs). (Tony)
 - Fixed bug #39836 (SplObjectStorage empty after unserialize). (Marcus)
 - Fixed bug #37799 (ftp_ssl_connect() falls back to non-ssl connection). (Nuno)
+- Fixed bug #34794 (proc_close() hangs when used with two processes).
+  (jdolecek at netbsd dot org, Nuno)
 
 08 Feb 2007, PHP 5.2.1
 - Added read-timeout context option "timeout" for HTTP streams. (Hannes, Ilia). 
index 49755ef86821b4a4bd3344a266e7fb15a17df8d0..c285be64848a0a5fb70aa579ef8057953fcfe35a 100644 (file)
@@ -943,6 +943,10 @@ PHP_FUNCTION(proc_open)
                                                        descriptors[i].mode_flags), mode_string, NULL);
 #else
                                stream = php_stream_fopen_from_fd(descriptors[i].parentend, mode_string, NULL);
+# if defined(F_SETFD) && defined(FD_CLOEXEC)
+                               /* mark the descriptor close-on-exec, so that it won't be inherited by potential other children */
+                               fcntl(descriptors[i].parentend, F_SETFD, FD_CLOEXEC);
+# endif
 #endif
                                if (stream) {
                                        zval *retfp;
diff --git a/ext/standard/tests/general_functions/bug34794.phpt b/ext/standard/tests/general_functions/bug34794.phpt
new file mode 100644 (file)
index 0000000..3aacf7e
--- /dev/null
@@ -0,0 +1,34 @@
+--TEST--
+bug #34794: proc_close() hangs when used with two processes
+--SKIPIF--
+<?php
+if (!is_executable('/bin/cat')) echo 'skip cat not found';
+?>
+--FILE--
+<?php
+echo "Opening process 1\n";
+$process1 = proc_open('/bin/cat', array(0 => array('pipe', 'r'), 1 =>array('pipe', 'r')), $pipes1);
+
+echo "Opening process 2\n";
+$process2 = proc_open('/bin/cat', array(0 => array('pipe', 'r'), 1 =>array('pipe', 'r')), $pipes2);
+
+
+echo "Closing process 1\n";
+fclose($pipes1[0]);
+fclose($pipes1[1]);
+proc_close($process1);
+
+echo "Closing process 2\n";
+fclose($pipes2[0]);
+fclose($pipes2[1]);
+proc_close($process2);
+
+echo "Done\n";
+
+?>
+--EXPECTF--
+Opening process 1
+Opening process 2
+Closing process 1
+Closing process 2
+Done