mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Promote warnings to exceptions in ext/pcntl
Closes GH-6004
This commit is contained in:
parent
4a98b64413
commit
3df306de94
9 changed files with 113 additions and 34 deletions
|
@ -892,9 +892,14 @@ PHP_FUNCTION(pcntl_signal)
|
||||||
RETURN_THROWS();
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signo < 1 || signo >= NSIG) {
|
if (signo < 1) {
|
||||||
php_error_docref(NULL, E_WARNING, "Invalid signal");
|
zend_argument_value_error(1, "must be greater than or equal to 1");
|
||||||
RETURN_FALSE;
|
RETURN_THROWS();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (signo >= NSIG) {
|
||||||
|
zend_argument_value_error(1, "must be less than %d", NSIG);
|
||||||
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PCNTL_G(spares)) {
|
if (!PCNTL_G(spares)) {
|
||||||
|
@ -920,8 +925,8 @@ PHP_FUNCTION(pcntl_signal)
|
||||||
/* Special long value case for SIG_DFL and SIG_IGN */
|
/* Special long value case for SIG_DFL and SIG_IGN */
|
||||||
if (Z_TYPE_P(handle) == IS_LONG) {
|
if (Z_TYPE_P(handle) == IS_LONG) {
|
||||||
if (Z_LVAL_P(handle) != (zend_long) SIG_DFL && Z_LVAL_P(handle) != (zend_long) SIG_IGN) {
|
if (Z_LVAL_P(handle) != (zend_long) SIG_DFL && Z_LVAL_P(handle) != (zend_long) SIG_IGN) {
|
||||||
php_error_docref(NULL, E_WARNING, "Invalid value for handle argument specified");
|
zend_argument_value_error(2, "must be either SIG_DFL or SIG_IGN when an integer value is given");
|
||||||
RETURN_FALSE;
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
if (php_signal(signo, (Sigfunc *) Z_LVAL_P(handle), (int) restart_syscalls) == (void *)SIG_ERR) {
|
if (php_signal(signo, (Sigfunc *) Z_LVAL_P(handle), (int) restart_syscalls) == (void *)SIG_ERR) {
|
||||||
PCNTL_G(last_error) = errno;
|
PCNTL_G(last_error) = errno;
|
||||||
|
@ -935,10 +940,11 @@ PHP_FUNCTION(pcntl_signal)
|
||||||
if (!zend_is_callable_ex(handle, NULL, 0, NULL, NULL, &error)) {
|
if (!zend_is_callable_ex(handle, NULL, 0, NULL, NULL, &error)) {
|
||||||
zend_string *func_name = zend_get_callable_name(handle);
|
zend_string *func_name = zend_get_callable_name(handle);
|
||||||
PCNTL_G(last_error) = EINVAL;
|
PCNTL_G(last_error) = EINVAL;
|
||||||
php_error_docref(NULL, E_WARNING, "Specified handler \"%s\" is not callable (%s)", ZSTR_VAL(func_name), error);
|
|
||||||
|
zend_argument_type_error(2, "must be of type callable|int, %s given", zend_zval_type_name(handle));
|
||||||
zend_string_release_ex(func_name, 0);
|
zend_string_release_ex(func_name, 0);
|
||||||
efree(error);
|
efree(error);
|
||||||
RETURN_FALSE;
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
ZEND_ASSERT(!error);
|
ZEND_ASSERT(!error);
|
||||||
|
|
||||||
|
@ -966,8 +972,8 @@ PHP_FUNCTION(pcntl_signal_get_handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signo < 1 || signo > 32) {
|
if (signo < 1 || signo > 32) {
|
||||||
php_error_docref(NULL, E_WARNING, "Invalid signal");
|
zend_argument_value_error(1, "must be between 1 and 32");
|
||||||
RETURN_FALSE;
|
RETURN_THROWS();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((prev_handle = zend_hash_index_find(&PCNTL_G(php_signal_table), signo)) != NULL) {
|
if ((prev_handle = zend_hash_index_find(&PCNTL_G(php_signal_table), signo)) != NULL) {
|
||||||
|
@ -1197,8 +1203,8 @@ PHP_FUNCTION(pcntl_getpriority)
|
||||||
php_error_docref(NULL, E_WARNING, "Error %d: No process was located using the given parameters", errno);
|
php_error_docref(NULL, E_WARNING, "Error %d: No process was located using the given parameters", errno);
|
||||||
break;
|
break;
|
||||||
case EINVAL:
|
case EINVAL:
|
||||||
php_error_docref(NULL, E_WARNING, "Error %d: Invalid identifier flag", errno);
|
zend_argument_value_error(2, "must be one of PRIO_PGRP, PRIO_USER, or PRIO_PROCESS");
|
||||||
break;
|
RETURN_THROWS();
|
||||||
default:
|
default:
|
||||||
php_error_docref(NULL, E_WARNING, "Unknown error %d has occurred", errno);
|
php_error_docref(NULL, E_WARNING, "Unknown error %d has occurred", errno);
|
||||||
break;
|
break;
|
||||||
|
@ -1231,8 +1237,8 @@ PHP_FUNCTION(pcntl_setpriority)
|
||||||
php_error_docref(NULL, E_WARNING, "Error %d: No process was located using the given parameters", errno);
|
php_error_docref(NULL, E_WARNING, "Error %d: No process was located using the given parameters", errno);
|
||||||
break;
|
break;
|
||||||
case EINVAL:
|
case EINVAL:
|
||||||
php_error_docref(NULL, E_WARNING, "Error %d: Invalid identifier flag", errno);
|
zend_argument_value_error(3, "must be one of PRIO_PGRP, PRIO_USER, or PRIO_PROCESS");
|
||||||
break;
|
RETURN_THROWS();
|
||||||
case EPERM:
|
case EPERM:
|
||||||
php_error_docref(NULL, E_WARNING, "Error %d: A process was located, but neither its effective nor real user ID matched the effective user ID of the caller", errno);
|
php_error_docref(NULL, E_WARNING, "Error %d: A process was located, but neither its effective nor real user ID matched the effective user ID of the caller", errno);
|
||||||
break;
|
break;
|
||||||
|
@ -1400,19 +1406,18 @@ PHP_FUNCTION(pcntl_async_signals)
|
||||||
PHP_FUNCTION(pcntl_unshare)
|
PHP_FUNCTION(pcntl_unshare)
|
||||||
{
|
{
|
||||||
zend_long flags;
|
zend_long flags;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||||
Z_PARAM_LONG(flags)
|
Z_PARAM_LONG(flags)
|
||||||
ZEND_PARSE_PARAMETERS_END();
|
ZEND_PARSE_PARAMETERS_END();
|
||||||
|
|
||||||
ret = unshare(flags);
|
if (unshare(flags) == -1) {
|
||||||
if (ret == -1) {
|
|
||||||
PCNTL_G(last_error) = errno;
|
PCNTL_G(last_error) = errno;
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
#ifdef EINVAL
|
#ifdef EINVAL
|
||||||
case EINVAL:
|
case EINVAL:
|
||||||
php_error_docref(NULL, E_WARNING, "Error %d: Invalid flag specified", errno);
|
zend_argument_value_error(1, "must be a combination of CLONE_* flags");
|
||||||
|
RETURN_THROWS();
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef ENOMEM
|
#ifdef ENOMEM
|
||||||
|
|
|
@ -19,7 +19,7 @@ function pcntl_wait(&$status, int $options = 0, &$rusage = []): int {}
|
||||||
/** @param callable|int $handler */
|
/** @param callable|int $handler */
|
||||||
function pcntl_signal(int $signo, $handler, bool $restart_syscalls = true): bool {}
|
function pcntl_signal(int $signo, $handler, bool $restart_syscalls = true): bool {}
|
||||||
|
|
||||||
/** @return mixed */
|
/** @return callable|int */
|
||||||
function pcntl_signal_get_handler(int $signo) {}
|
function pcntl_signal_get_handler(int $signo) {}
|
||||||
|
|
||||||
function pcntl_signal_dispatch(): bool {}
|
function pcntl_signal_dispatch(): bool {}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* This is a generated file, edit the .stub.php file instead.
|
/* This is a generated file, edit the .stub.php file instead.
|
||||||
* Stub hash: df744f88533ce9b84864fa2aa4dd7a5b7373231d */
|
* Stub hash: 306208d94ba3bf6f8112f868a332e99717bc07fa */
|
||||||
|
|
||||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_fork, 0, 0, IS_LONG, 0)
|
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pcntl_fork, 0, 0, IS_LONG, 0)
|
||||||
ZEND_END_ARG_INFO()
|
ZEND_END_ARG_INFO()
|
||||||
|
|
23
ext/pcntl/tests/pcntl_getpriority_error.phpt
Normal file
23
ext/pcntl/tests/pcntl_getpriority_error.phpt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
--TEST--
|
||||||
|
pcntl_getpriority() - Wrong process identifier
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded('pcntl')) {
|
||||||
|
die('skip ext/pcntl not loaded');
|
||||||
|
}
|
||||||
|
if (!function_exists('pcntl_getpriority')) {
|
||||||
|
die('skip pcntl_getpriority doesn\'t exist');
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
try {
|
||||||
|
pcntl_getpriority(null, 42);
|
||||||
|
} catch (ValueError $exception) {
|
||||||
|
echo $exception->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
pcntl_getpriority(): Argument #2 ($process_identifier) must be one of PRIO_PGRP, PRIO_USER, or PRIO_PROCESS
|
23
ext/pcntl/tests/pcntl_setpriority_error.phpt
Normal file
23
ext/pcntl/tests/pcntl_setpriority_error.phpt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
--TEST--
|
||||||
|
pcntl_setpriority() - Wrong process identifier
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded('pcntl')) {
|
||||||
|
die('skip ext/pcntl not loaded');
|
||||||
|
}
|
||||||
|
if (!function_exists('pcntl_setpriority')) {
|
||||||
|
die('skip pcntl_setpriority doesn\'t exist');
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
try {
|
||||||
|
pcntl_setpriority(0, null, 42);
|
||||||
|
} catch (ValueError $exception) {
|
||||||
|
echo $exception->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
pcntl_setpriority(): Argument #3 ($process_identifier) must be one of PRIO_PGRP, PRIO_USER, or PRIO_PROCESS
|
|
@ -18,10 +18,24 @@ posix_kill(posix_getpid(), SIGUSR1);
|
||||||
pcntl_signal_dispatch();
|
pcntl_signal_dispatch();
|
||||||
|
|
||||||
var_dump(pcntl_signal(SIGALRM, SIG_IGN));
|
var_dump(pcntl_signal(SIGALRM, SIG_IGN));
|
||||||
var_dump(pcntl_signal(-1, -1));
|
|
||||||
var_dump(pcntl_signal(-1, function(){}));
|
|
||||||
var_dump(pcntl_signal(SIGALRM, "not callable"));
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
pcntl_signal(-1, -1);
|
||||||
|
} catch (ValueError $exception) {
|
||||||
|
echo $exception->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pcntl_signal(-1, function(){});
|
||||||
|
} catch (ValueError $exception) {
|
||||||
|
echo $exception->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pcntl_signal(SIGALRM, "not callable");
|
||||||
|
} catch (TypeError $exception) {
|
||||||
|
echo $exception->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
/* test freeing queue in RSHUTDOWN */
|
/* test freeing queue in RSHUTDOWN */
|
||||||
posix_kill(posix_getpid(), SIGTERM);
|
posix_kill(posix_getpid(), SIGTERM);
|
||||||
|
@ -31,13 +45,7 @@ echo "ok\n";
|
||||||
signal dispatched
|
signal dispatched
|
||||||
got signal from %r\d+|nobody%r
|
got signal from %r\d+|nobody%r
|
||||||
bool(true)
|
bool(true)
|
||||||
|
pcntl_signal(): Argument #1 ($signo) must be greater than or equal to 1
|
||||||
Warning: pcntl_signal(): Invalid signal %s
|
pcntl_signal(): Argument #1 ($signo) must be greater than or equal to 1
|
||||||
bool(false)
|
pcntl_signal(): Argument #2 ($handler) must be of type callable|int, string given
|
||||||
|
|
||||||
Warning: pcntl_signal(): Invalid signal %s
|
|
||||||
bool(false)
|
|
||||||
|
|
||||||
Warning: pcntl_signal(): Specified handler "not callable" is not callable (%s) in %s
|
|
||||||
bool(false)
|
|
||||||
ok
|
ok
|
||||||
|
|
|
@ -7,9 +7,9 @@ if (!extension_loaded("posix")) die("skip posix extension not available");
|
||||||
if (!function_exists("pcntl_unshare")) die("skip pcntl_unshare is not available");
|
if (!function_exists("pcntl_unshare")) die("skip pcntl_unshare is not available");
|
||||||
if (!defined("CLONE_NEWUSER")) die("skip flag unavailable");
|
if (!defined("CLONE_NEWUSER")) die("skip flag unavailable");
|
||||||
if (@pcntl_unshare(CLONE_NEWUSER) == false && pcntl_get_last_error() == PCNTL_EPERM) {
|
if (@pcntl_unshare(CLONE_NEWUSER) == false && pcntl_get_last_error() == PCNTL_EPERM) {
|
||||||
die("skip Insufficient previleges to use CLONE_NEWUSER");
|
die("skip Insufficient privileges to use CLONE_NEWUSER");
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
--FILE--
|
--FILE--
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ if (posix_getuid() !== 0 &&
|
||||||
if (@pcntl_unshare(CLONE_NEWPID) == false && pcntl_get_last_error() == PCNTL_EPERM) {
|
if (@pcntl_unshare(CLONE_NEWPID) == false && pcntl_get_last_error() == PCNTL_EPERM) {
|
||||||
die("skip Insufficient privileges for CLONE_NEWPID");
|
die("skip Insufficient privileges for CLONE_NEWPID");
|
||||||
}
|
}
|
||||||
|
?>
|
||||||
--FILE--
|
--FILE--
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
20
ext/pcntl/tests/pcntl_unshare_04.phpt
Normal file
20
ext/pcntl/tests/pcntl_unshare_04.phpt
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
--TEST--
|
||||||
|
pcntl_unshare() with wrong flag
|
||||||
|
--SKIPIF--
|
||||||
|
<?php
|
||||||
|
if (!extension_loaded("pcntl")) die("skip");
|
||||||
|
if (!extension_loaded("posix")) die("skip posix extension not available");
|
||||||
|
if (!function_exists("pcntl_unshare")) die("skip pcntl_unshare is not available");
|
||||||
|
?>
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
|
||||||
|
try {
|
||||||
|
pcntl_unshare(42);
|
||||||
|
} catch (ValueError $exception) {
|
||||||
|
echo $exception->getMessage() . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
pcntl_unshare(): Argument #1 ($flags) must be a combination of CLONE_* flags
|
Loading…
Add table
Add a link
Reference in a new issue