summaryrefslogtreecommitdiff
path: root/ext/standard
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2001-02-22 10:15:52 +0000
committerStanislav Malyshev <stas@php.net>2001-02-22 10:15:52 +0000
commit4cda96691c58ace48deec55aad22e31297506571 (patch)
tree406ddc49cca7c099d087c35070bfbe17fd42ba4e /ext/standard
parent454221ba621aaf163cc642e40ed1a0892b2e2db7 (diff)
downloadphp-git-4cda96691c58ace48deec55aad22e31297506571.tar.gz
Fix #8992, patch by yasushi_takahashi@tsuken.co.jp
Diffstat (limited to 'ext/standard')
-rw-r--r--ext/standard/exec.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/ext/standard/exec.c b/ext/standard/exec.c
index ed83321107..438112b922 100644
--- a/ext/standard/exec.c
+++ b/ext/standard/exec.c
@@ -31,6 +31,9 @@
#if HAVE_SYS_WAIT_H
#include <sys/wait.h>
#endif
+#if HAVE_SIGNAL_H
+#include <signal.h>
+#endif
/*
* If type==0, only last line of output is returned (exec)
@@ -48,6 +51,7 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value)
int overflow_limit, lcmd, ldir;
int rsrc_id;
char *b, *c, *d=NULL;
+ void (*sig_handler)();
PLS_FETCH();
FLS_FETCH();
@@ -89,6 +93,8 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value)
tmp = php_escape_shell_cmd(d);
efree(d);
d = tmp;
+
+ sig_handler = signal (SIGCHLD, SIG_DFL);
#ifdef PHP_WIN32
fp = V_POPEN(d, "rb");
#else
@@ -98,9 +104,11 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value)
php_error(E_WARNING, "Unable to fork [%s]", d);
efree(d);
efree(buf);
+ signal (SIGCHLD, sig_handler);
return -1;
}
} else { /* not safe_mode */
+ sig_handler = signal (SIGCHLD, SIG_DFL);
#ifdef PHP_WIN32
fp = V_POPEN(cmd, "rb");
#else
@@ -109,6 +117,7 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value)
if (!fp) {
php_error(E_WARNING, "Unable to fork [%s]", cmd);
efree(buf);
+ signal (SIGCHLD, sig_handler);
return -1;
}
}
@@ -137,6 +146,7 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value)
if ( buf == NULL ) {
php_error(E_WARNING, "Unable to erealloc %d bytes for exec buffer",
buflen + EXEC_INPUT_BUF);
+ signal (SIGCHLD, sig_handler);
return -1;
}
buflen += EXEC_INPUT_BUF;
@@ -203,6 +213,7 @@ int php_Exec(int type, char *cmd, pval *array, pval *return_value)
}
#endif
+ signal (SIGCHLD, sig_handler);
if (d) {
efree(d);
}