- Fixed bug #40410 (ext/posix does not compile on MacOS 10.3.9). (Tony)
- Fixed bug #40109 (iptcembed fails on non-jfif jpegs). (Tony)
- Fixed bug #39836 (SplObjectStorage empty after unserialize). (Marcus)
+- Fixed bug #39322 (proc_terminate() destroys process resource). (Nuno)
- 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)
}
/* }}} */
-/* {{{ proto int proc_terminate(resource process [, long signal])
+/* {{{ proto bool proc_terminate(resource process [, long signal])
kill a process opened by proc_open */
PHP_FUNCTION(proc_terminate)
{
ZEND_FETCH_RESOURCE(proc, struct php_process_handle *, &zproc, -1, "process", le_proc_open);
#ifdef PHP_WIN32
- TerminateProcess(proc->childHandle, 255);
+ if (TerminateProcess(proc->childHandle, 255)) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
#else
- kill(proc->child, sig_no);
+ if (kill(proc->child, sig_no) == 0) {
+ RETURN_TRUE;
+ } else {
+ RETURN_FALSE;
+ }
#endif
-
- zend_list_delete(Z_LVAL_P(zproc));
- RETURN_LONG(FG(pclose_ret));
}
/* }}} */
--- /dev/null
+--TEST--
+bug #39322: proc_terminate() loosing process resource
+--SKIPIF--
+<?php
+if (!is_executable('/bin/sleep')) echo 'skip sleep not found';
+?>
+--FILE--
+<?php
+$descriptors = array(
+ 0 => array('pipe', 'r'),
+ 1 => array('pipe', 'w'),
+ 2 => array('pipe', 'w'));
+
+$pipes = array();
+
+$process = proc_open('/bin/sleep 120', $descriptors, $pipes);
+
+proc_terminate($process);
+sleep(1); // wait a bit to let the process finish
+var_dump(proc_get_status($process));
+
+echo "Done!\n";
+
+?>
+--EXPECTF--
+array(8) {
+ ["command"]=>
+ string(14) "/bin/sleep 120"
+ ["pid"]=>
+ int(%d)
+ ["running"]=>
+ bool(false)
+ ["signaled"]=>
+ bool(true)
+ ["stopped"]=>
+ bool(false)
+ ["exitcode"]=>
+ int(-1)
+ ["termsig"]=>
+ int(15)
+ ["stopsig"]=>
+ int(0)
+}
+Done!
--- /dev/null
+--TEST--
+proc_open
+--SKIPIF--
+<?php
+if (!is_executable('/bin/sleep')) echo 'skip no sleep';
+if (!is_executable('/bin/nohup')) echo 'skip no nohup';
+?>
+--FILE--
+<?php
+$ds = array(array('pipe', 'r'));
+
+$cat = proc_open(
+ '/bin/nohup /bin/sleep 50',
+ $ds,
+ $pipes
+);
+
+var_dump(proc_terminate($cat, 1)); // send a SIGHUP
+sleep(1);
+var_dump(proc_get_status($cat));
+
+var_dump(proc_terminate($cat)); // now really quit it
+sleep(1);
+var_dump(proc_get_status($cat));
+
+proc_close($cat);
+
+echo "Done!\n";
+
+?>
+--EXPECTF--
+bool(true)
+array(8) {
+ ["command"]=>
+ string(24) "/bin/nohup /bin/sleep 50"
+ ["pid"]=>
+ int(%d)
+ ["running"]=>
+ bool(true)
+ ["signaled"]=>
+ bool(false)
+ ["stopped"]=>
+ bool(false)
+ ["exitcode"]=>
+ int(-1)
+ ["termsig"]=>
+ int(0)
+ ["stopsig"]=>
+ int(0)
+}
+bool(true)
+array(8) {
+ ["command"]=>
+ string(24) "/bin/nohup /bin/sleep 50"
+ ["pid"]=>
+ int(%d)
+ ["running"]=>
+ bool(false)
+ ["signaled"]=>
+ bool(true)
+ ["stopped"]=>
+ bool(false)
+ ["exitcode"]=>
+ int(-1)
+ ["termsig"]=>
+ int(15)
+ ["stopsig"]=>
+ int(0)
+}
+Done!