]> granicus.if.org Git - php/commitdiff
Fix #78402: pcntl_signal() misleading error message
authorSATO Kentaro <kentaro@ranvis.com>
Tue, 17 Dec 2019 19:03:42 +0000 (04:03 +0900)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 20 Dec 2019 10:02:20 +0000 (11:02 +0100)
An error message can be misleading when a handler
passed to pcntl_signal() is not callable.

NEWS
ext/pcntl/pcntl.c
ext/pcntl/tests/pcntl_signal.phpt

diff --git a/NEWS b/NEWS
index 60e91f19df1e76c0e19b178b32c64f311cc96da8..12f4edc672fb93e766296ddca089f190ea41d820 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,10 @@ PHP                                                                        NEWS
   . Fixed bug #78923 (Artifacts when convoluting image with transparency).
     (wilson chen)
 
+- Pcntl:
+  . Fixed bug #78402 (Converting null to string in error message is bad DX).
+    (SATŌ Kentarō)
+
 - PDO_PgSQL:
   . Fixed bug #78983 (pdo_pgsql config.w32 cannot find libpq-fe.h). (SATŌ
     Kentarō)
index c6236f96636a8d8bbfd574ac832038f57576bc74..11f6164eb8fb808effffa63154931ddee8d6d758 100644 (file)
@@ -1005,6 +1005,7 @@ PHP_FUNCTION(pcntl_signal)
        zval *handle;
        zend_long signo;
        zend_bool restart_syscalls = 1;
+       char *error = NULL;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|b", &signo, &handle, &restart_syscalls) == FAILURE) {
                return;
@@ -1043,13 +1044,15 @@ PHP_FUNCTION(pcntl_signal)
                RETURN_TRUE;
        }
 
-       if (!zend_is_callable(handle, 0, NULL)) {
+       if (!zend_is_callable_ex(handle, NULL, 0, NULL, NULL, &error)) {
                zend_string *func_name = zend_get_callable_name(handle);
                PCNTL_G(last_error) = EINVAL;
-               php_error_docref(NULL, E_WARNING, "%s is not a callable function name error", ZSTR_VAL(func_name));
+               php_error_docref(NULL, E_WARNING, "Specified handler \"%s\" is not callable (%s)", ZSTR_VAL(func_name), error);
                zend_string_release_ex(func_name, 0);
+               efree(error);
                RETURN_FALSE;
        }
+       ZEND_ASSERT(!error);
 
        /* Add the function name to our signal table */
        handle = zend_hash_index_update(&PCNTL_G(php_signal_table), signo, handle);
index a6441935c110125d853bd7dddb7f4d71645391a9..953ff54eefd01ef6010cf1646cf9d4fe3f678345 100644 (file)
@@ -42,6 +42,6 @@ bool(false)
 Warning: pcntl_signal(): Invalid signal %s
 bool(false)
 
-Warning: pcntl_signal(): not callable is not a callable function name error in %s
+Warning: pcntl_signal(): Specified handler "not callable" is not callable (%s) in %s
 bool(false)
 ok