From 2dce38f5987c3f013a36cfcfcd534ac18652d4aa Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Fri, 3 Jun 2011 17:18:46 +0000 Subject: [PATCH] Fixed crash and improved signal validation --- ext/pcntl/pcntl.c | 10 ++++++++-- ext/pcntl/tests/pcntl_signal.phpt | 6 ++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index d07b9ea047..d2a9130230 100755 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -849,6 +849,11 @@ PHP_FUNCTION(pcntl_signal) return; } + if (signo < 1 || signo > 32) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid signal"); + RETURN_FALSE; + } + if (!PCNTL_G(spares)) { /* since calling malloc() from within a signal handler is not portable, * pre-allocate a few records for recording signals */ @@ -863,9 +868,10 @@ PHP_FUNCTION(pcntl_signal) } /* Special long value case for SIG_DFL and SIG_IGN */ - if (Z_TYPE_P(handle)==IS_LONG) { - if (Z_LVAL_P(handle)!= (long) SIG_DFL && Z_LVAL_P(handle) != (long) SIG_IGN) { + if (Z_TYPE_P(handle) == IS_LONG) { + if (Z_LVAL_P(handle) != (long) SIG_DFL && Z_LVAL_P(handle) != (long) SIG_IGN) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid value for handle argument specified"); + RETURN_FALSE; } if (php_signal(signo, (Sigfunc *) Z_LVAL_P(handle), (int) restart_syscalls) == SIG_ERR) { PCNTL_G(last_error) = errno; diff --git a/ext/pcntl/tests/pcntl_signal.phpt b/ext/pcntl/tests/pcntl_signal.phpt index 977f26fbcc..efd4bba953 100644 --- a/ext/pcntl/tests/pcntl_signal.phpt +++ b/ext/pcntl/tests/pcntl_signal.phpt @@ -28,12 +28,10 @@ Warning: pcntl_signal() expects at least 2 parameters, 0 given in %s NULL bool(true) -Warning: pcntl_signal(): Invalid value for handle argument specified in %s - -Warning: pcntl_signal(): Error assigning signal %s +Warning: pcntl_signal(): Invalid signal %s bool(false) -Warning: pcntl_signal(): Error assigning signal %s +Warning: pcntl_signal(): Invalid signal %s bool(false) Warning: pcntl_signal(): not callable is not a callable function name error in %s -- 2.50.1