From d9f3ba66b087e653db358d2af4c11f0120c96b85 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 13:48:55 +0000 Subject: [PATCH 1/7] main/SAPI.c: header_register_callback() always returns true --- ext/standard/basic_functions.stub.php | 2 +- ext/standard/basic_functions_arginfo.h | 4 ++-- ext/standard/basic_functions_decl.h | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 1f3d5617f8dfb..7daf9799bf361 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -1504,7 +1504,7 @@ function set_time_limit(int $seconds): bool {} /* main/SAPI.c */ -function header_register_callback(callable $callback): bool {} +function header_register_callback(callable $callback): true {} /* main/output.c */ diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 991d76d91fc1c..34d715ebaf0a3 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,12 +1,12 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 749c71a6220260eb3fb593b982a9d97821e0539b + * Stub hash: dbd55959a4a888d70312757bd94e451a099ce467 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_header_register_callback, 0, 1, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_header_register_callback, 0, 1, IS_TRUE, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) ZEND_END_ARG_INFO() diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index fce41100fc79a..d025743d9e256 100644 --- a/ext/standard/basic_functions_decl.h +++ b/ext/standard/basic_functions_decl.h @@ -1,8 +1,8 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 749c71a6220260eb3fb593b982a9d97821e0539b */ + * Stub hash: dbd55959a4a888d70312757bd94e451a099ce467 */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_749c71a6220260eb3fb593b982a9d97821e0539b_H -#define ZEND_BASIC_FUNCTIONS_DECL_749c71a6220260eb3fb593b982a9d97821e0539b_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_dbd55959a4a888d70312757bd94e451a099ce467_H +#define ZEND_BASIC_FUNCTIONS_DECL_dbd55959a4a888d70312757bd94e451a099ce467_H typedef enum zend_enum_SortDirection { ZEND_ENUM_SortDirection_Ascending = 1, @@ -20,4 +20,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_749c71a6220260eb3fb593b982a9d97821e0539b_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_dbd55959a4a888d70312757bd94e451a099ce467_H */ From e5edab2f4270df529d01a7283c879173ff21d8ad Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 13:49:40 +0000 Subject: [PATCH 2/7] main/output.c: use RETURN_BOOL() when possible --- main/output.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/main/output.c b/main/output.c index 98684955e394a..2ee12f5954eb1 100644 --- a/main/output.c +++ b/main/output.c @@ -1577,11 +1577,7 @@ PHP_FUNCTION(output_reset_rewrite_vars) { ZEND_PARSE_PARAMETERS_NONE(); - if (php_url_scanner_reset_vars() == SUCCESS) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } + RETURN_BOOL(php_url_scanner_reset_vars() == SUCCESS); } /* }}} */ @@ -1595,10 +1591,6 @@ PHP_FUNCTION(output_add_rewrite_var) RETURN_THROWS(); } - if (php_url_scanner_add_var(name, name_len, value, value_len, 1) == SUCCESS) { - RETURN_TRUE; - } else { - RETURN_FALSE; - } + RETURN_BOOL(php_url_scanner_add_var(name, name_len, value, value_len, 1) == SUCCESS); } /* }}} */ From 7b572f24fe7ad55ca301661710bf0cbfc04e70ba Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 14:09:22 +0000 Subject: [PATCH 3/7] ext/standard/basic_functions.c: return bool instead of int for ignore_user_abort() The INI setting is stored and displayed as a bool already. --- ext/standard/basic_functions.c | 6 +++--- ext/standard/basic_functions.stub.php | 2 +- ext/standard/basic_functions_arginfo.h | 4 ++-- ext/standard/basic_functions_decl.h | 8 ++++---- ext/standard/tests/general_functions/bug72300.phpt | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index a611433af5374..f964183034923 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2113,14 +2113,14 @@ PHP_FUNCTION(ignore_user_abort) { bool arg = 0; bool arg_is_null = 1; - int old_setting; + bool old_setting; ZEND_PARSE_PARAMETERS_START(0, 1) Z_PARAM_OPTIONAL Z_PARAM_BOOL_OR_NULL(arg, arg_is_null) ZEND_PARSE_PARAMETERS_END(); - old_setting = (unsigned short)PG(ignore_user_abort); + old_setting = PG(ignore_user_abort); if (!arg_is_null) { zend_string *key = ZSTR_INIT_LITERAL("ignore_user_abort", 0); @@ -2128,7 +2128,7 @@ PHP_FUNCTION(ignore_user_abort) zend_string_release_ex(key, 0); } - RETURN_LONG(old_setting); + RETURN_BOOL(old_setting); } /* }}} */ diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 7daf9799bf361..51efe0a7a9c77 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2039,7 +2039,7 @@ function connection_aborted(): int {} function connection_status(): int {} -function ignore_user_abort(?bool $enable = null): int {} +function ignore_user_abort(?bool $enable = null): bool {} #ifdef HAVE_GETSERVBYNAME function getservbyname(string $service, string $protocol): int|false {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 34d715ebaf0a3..80b6d75c2bade 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: dbd55959a4a888d70312757bd94e451a099ce467 + * Stub hash: 4eef807a209c07934c429806a991a0a4fc860e5b * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) @@ -544,7 +544,7 @@ ZEND_END_ARG_INFO() #define arginfo_connection_status arginfo_ob_get_level -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ignore_user_abort, 0, 0, IS_LONG, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_ignore_user_abort, 0, 0, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, enable, _IS_BOOL, 1, "null") ZEND_END_ARG_INFO() diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index d025743d9e256..6e5d1895acb21 100644 --- a/ext/standard/basic_functions_decl.h +++ b/ext/standard/basic_functions_decl.h @@ -1,8 +1,8 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: dbd55959a4a888d70312757bd94e451a099ce467 */ + * Stub hash: 4eef807a209c07934c429806a991a0a4fc860e5b */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_dbd55959a4a888d70312757bd94e451a099ce467_H -#define ZEND_BASIC_FUNCTIONS_DECL_dbd55959a4a888d70312757bd94e451a099ce467_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_4eef807a209c07934c429806a991a0a4fc860e5b_H +#define ZEND_BASIC_FUNCTIONS_DECL_4eef807a209c07934c429806a991a0a4fc860e5b_H typedef enum zend_enum_SortDirection { ZEND_ENUM_SortDirection_Ascending = 1, @@ -20,4 +20,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_dbd55959a4a888d70312757bd94e451a099ce467_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_4eef807a209c07934c429806a991a0a4fc860e5b_H */ diff --git a/ext/standard/tests/general_functions/bug72300.phpt b/ext/standard/tests/general_functions/bug72300.phpt index 94d1f20f8ad89..4b82986e134d1 100644 --- a/ext/standard/tests/general_functions/bug72300.phpt +++ b/ext/standard/tests/general_functions/bug72300.phpt @@ -14,9 +14,9 @@ var_dump(ini_get("ignore_user_abort")); ?> --EXPECT-- -int(0) -int(1) +bool(false) +bool(true) string(1) "1" -int(1) -int(0) +bool(true) +bool(false) string(1) "0" From 888f048d01e08a1e73ca1094ee1a3b87e5355224 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 14:11:06 +0000 Subject: [PATCH 4/7] ext/standard/basic_functions.c: return bool instead of int for connection_aborted() --- ext/standard/basic_functions.c | 2 +- ext/standard/basic_functions.stub.php | 2 +- ext/standard/basic_functions_arginfo.h | 4 ++-- ext/standard/basic_functions_decl.h | 8 ++++---- .../tests/general_functions/connection_aborted.phpt | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index f964183034923..952c0d0235824 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -2095,7 +2095,7 @@ PHP_FUNCTION(connection_aborted) { ZEND_PARSE_PARAMETERS_NONE(); - RETURN_LONG(PG(connection_status) & PHP_CONNECTION_ABORTED); + RETURN_BOOL(PG(connection_status) & PHP_CONNECTION_ABORTED); } /* }}} */ diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 51efe0a7a9c77..ada6da0cf0b81 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2035,7 +2035,7 @@ function get_include_path(): string|false {} /** @refcount 1 */ function print_r(mixed $value, bool $return = false): string|true {} -function connection_aborted(): int {} +function connection_aborted(): bool {} function connection_status(): int {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 80b6d75c2bade..281c02b0c099d 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 4eef807a209c07934c429806a991a0a4fc860e5b + * Stub hash: 355a3032a9c98ba5db8ff0183c8b919c00e18097 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) @@ -540,7 +540,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_print_r, 0, 1, MAY_BE_STRING|MAY ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, return, _IS_BOOL, 0, "false") ZEND_END_ARG_INFO() -#define arginfo_connection_aborted arginfo_ob_get_level +#define arginfo_connection_aborted arginfo_ob_flush #define arginfo_connection_status arginfo_ob_get_level diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index 6e5d1895acb21..b2bd2162b93d7 100644 --- a/ext/standard/basic_functions_decl.h +++ b/ext/standard/basic_functions_decl.h @@ -1,8 +1,8 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 4eef807a209c07934c429806a991a0a4fc860e5b */ + * Stub hash: 355a3032a9c98ba5db8ff0183c8b919c00e18097 */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_4eef807a209c07934c429806a991a0a4fc860e5b_H -#define ZEND_BASIC_FUNCTIONS_DECL_4eef807a209c07934c429806a991a0a4fc860e5b_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_355a3032a9c98ba5db8ff0183c8b919c00e18097_H +#define ZEND_BASIC_FUNCTIONS_DECL_355a3032a9c98ba5db8ff0183c8b919c00e18097_H typedef enum zend_enum_SortDirection { ZEND_ENUM_SortDirection_Ascending = 1, @@ -20,4 +20,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_4eef807a209c07934c429806a991a0a4fc860e5b_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_355a3032a9c98ba5db8ff0183c8b919c00e18097_H */ diff --git a/ext/standard/tests/general_functions/connection_aborted.phpt b/ext/standard/tests/general_functions/connection_aborted.phpt index 5932095f0978d..d40f3cf83d5cf 100644 --- a/ext/standard/tests/general_functions/connection_aborted.phpt +++ b/ext/standard/tests/general_functions/connection_aborted.phpt @@ -1,5 +1,5 @@ --TEST-- -int connection_aborted ( void ); +Basic test for connection_aborted() --CREDITS-- marcosptf - - #phparty7 - @phpsp - novatec/2015 - sao paulo - br --FILE-- @@ -7,4 +7,4 @@ marcosptf - - #phparty7 - @phpsp - novatec/2015 - sao p var_dump(connection_aborted()); ?> --EXPECT-- -int(0) +bool(false) From 05943343bb47dfa07276126c2cd4023afecf96b7 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 14:15:31 +0000 Subject: [PATCH 5/7] ext/standard/basic_functions.c: register_tick_function() always returns true --- ext/standard/basic_functions.stub.php | 2 +- ext/standard/basic_functions_arginfo.h | 4 ++-- ext/standard/basic_functions_decl.h | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index ada6da0cf0b81..f9484be756ab2 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2059,7 +2059,7 @@ function getprotobyname(string $protocol): int|false {} function getprotobynumber(int $protocol): string|false {} #endif -function register_tick_function(callable $callback, mixed ...$args): bool {} +function register_tick_function(callable $callback, mixed ...$args): true {} function unregister_tick_function(callable $callback): void {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 281c02b0c099d..8a63dd0f78c87 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 355a3032a9c98ba5db8ff0183c8b919c00e18097 + * Stub hash: 34560244f9d3c31d69b866e22a08bf0b26970364 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) @@ -574,7 +574,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_getprotobynumber, 0, 1, MAY_BE_S ZEND_END_ARG_INFO() #endif -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_tick_function, 0, 1, _IS_BOOL, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_register_tick_function, 0, 1, IS_TRUE, 0) ZEND_ARG_TYPE_INFO(0, callback, IS_CALLABLE, 0) ZEND_ARG_VARIADIC_TYPE_INFO(0, args, IS_MIXED, 0) ZEND_END_ARG_INFO() diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index b2bd2162b93d7..a637cd0a0473f 100644 --- a/ext/standard/basic_functions_decl.h +++ b/ext/standard/basic_functions_decl.h @@ -1,8 +1,8 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 355a3032a9c98ba5db8ff0183c8b919c00e18097 */ + * Stub hash: 34560244f9d3c31d69b866e22a08bf0b26970364 */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_355a3032a9c98ba5db8ff0183c8b919c00e18097_H -#define ZEND_BASIC_FUNCTIONS_DECL_355a3032a9c98ba5db8ff0183c8b919c00e18097_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_34560244f9d3c31d69b866e22a08bf0b26970364_H +#define ZEND_BASIC_FUNCTIONS_DECL_34560244f9d3c31d69b866e22a08bf0b26970364_H typedef enum zend_enum_SortDirection { ZEND_ENUM_SortDirection_Ascending = 1, @@ -20,4 +20,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_355a3032a9c98ba5db8ff0183c8b919c00e18097_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_34560244f9d3c31d69b866e22a08bf0b26970364_H */ From 51abd7074131e8f391831ed1739313b4d3c5455b Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 14:43:49 +0000 Subject: [PATCH 6/7] ext/standard/basic_functions.c: handle time_nanosleep() inputs ahead of time --- ext/standard/basic_functions.c | 8 +++---- .../tests/misc/time_nanosleep_error4.phpt | 14 ++++++------ .../tests/misc/time_nanosleep_error5.phpt | 14 ++++++------ ext/standard/tests/time/bug60222.phpt | 22 +++++++++---------- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 952c0d0235824..966c7ebd507c2 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1159,8 +1159,8 @@ PHP_FUNCTION(time_nanosleep) zend_argument_value_error(1, "must be greater than or equal to 0"); RETURN_THROWS(); } - if (tv_nsec < 0) { - zend_argument_value_error(2, "must be greater than or equal to 0"); + if (tv_nsec < 0 || tv_nsec > 999999999) { + zend_argument_value_error(2, "must be between 0 and 999999999"); RETURN_THROWS(); } @@ -1174,10 +1174,8 @@ PHP_FUNCTION(time_nanosleep) add_assoc_long_ex(return_value, "seconds", sizeof("seconds")-1, php_rem.tv_sec); add_assoc_long_ex(return_value, "nanoseconds", sizeof("nanoseconds")-1, php_rem.tv_nsec); return; - } else if (errno == EINVAL) { - zend_value_error("Nanoseconds was not in the range 0 to 999 999 999 or seconds was negative"); - RETURN_THROWS(); } + ZEND_ASSERT(errno != EINVAL); RETURN_FALSE; } diff --git a/ext/standard/tests/misc/time_nanosleep_error4.phpt b/ext/standard/tests/misc/time_nanosleep_error4.phpt index 740a68b8344b0..12bf4e32c01a9 100644 --- a/ext/standard/tests/misc/time_nanosleep_error4.phpt +++ b/ext/standard/tests/misc/time_nanosleep_error4.phpt @@ -10,12 +10,12 @@ if (!function_exists('time_nanosleep')) die("skip"); --FILE-- getMessage(), "\n"; +} ?> ---EXPECTF-- -Fatal error: Uncaught ValueError: time_nanosleep(): Argument #2 ($nanoseconds) must be greater than or equal to 0 in %s:%d -Stack trace: -#0 %s(%d): time_nanosleep(0, -10) -#1 {main} - thrown in %s on line %d +--EXPECT-- +time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999 diff --git a/ext/standard/tests/misc/time_nanosleep_error5.phpt b/ext/standard/tests/misc/time_nanosleep_error5.phpt index 7116da5519ca0..2c374388a6324 100644 --- a/ext/standard/tests/misc/time_nanosleep_error5.phpt +++ b/ext/standard/tests/misc/time_nanosleep_error5.phpt @@ -7,12 +7,12 @@ time_nanosleep — Delay for a number of seconds and nanoseconds --FILE-- getMessage(), "\n"; +} ?> ---EXPECTF-- -Fatal error: Uncaught ValueError: Nanoseconds was not in the range 0 to 999 999 999 or seconds was negative in %s:%d -Stack trace: -#0 %s(%d): time_nanosleep(0, 1000000000) -#1 {main} - thrown in %s on line %d +--EXPECT-- +time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999 diff --git a/ext/standard/tests/time/bug60222.phpt b/ext/standard/tests/time/bug60222.phpt index 0256e2de1d5c2..1b607758cf032 100644 --- a/ext/standard/tests/time/bug60222.phpt +++ b/ext/standard/tests/time/bug60222.phpt @@ -2,18 +2,18 @@ Bug #60222 (time_nanosleep() does validate input params) --FILE-- getMessage() . "\n"; - } +try { + time_nanosleep(-1, 0); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} - try { - time_nanosleep(0, -1); - } catch (ValueError $exception) { - echo $exception->getMessage() . "\n"; - } +try { + time_nanosleep(0, -1); +} catch (ValueError $exception) { + echo $exception->getMessage() . "\n"; +} ?> --EXPECT-- time_nanosleep(): Argument #1 ($seconds) must be greater than or equal to 0 -time_nanosleep(): Argument #2 ($nanoseconds) must be greater than or equal to 0 +time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999 From 96e1350ac66c1f58a6dd75e1b0196fcabbab3949 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Sat, 29 Nov 2025 14:46:25 +0000 Subject: [PATCH 7/7] ext/standard/basic_functions.c: perform basic input checks for ip2long() --- ext/standard/basic_functions.c | 7 ++++++- ext/standard/tests/network/ip.phpt | 6 ++---- .../tests/network/ip2long_errors.phpt | 20 +++++++++++++++++++ ext/standard/tests/network/ip_x86_64.phpt | 7 ++----- 4 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 ext/standard/tests/network/ip2long_errors.phpt diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 966c7ebd507c2..751656a6584e1 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -597,7 +597,12 @@ PHP_FUNCTION(ip2long) Z_PARAM_PATH(addr, addr_len) ZEND_PARSE_PARAMETERS_END(); - if (addr_len == 0 || inet_pton(AF_INET, addr, &ip) != 1) { + if (addr_len == 0) { + zend_argument_must_not_be_empty_error(1); + RETURN_THROWS(); + } + + if (inet_pton(AF_INET, addr, &ip) != 1) { RETURN_FALSE; } RETURN_LONG(ntohl(ip.s_addr)); diff --git a/ext/standard/tests/network/ip.phpt b/ext/standard/tests/network/ip.phpt index b6ac49d5df6af..6924befea3b0b 100644 --- a/ext/standard/tests/network/ip.phpt +++ b/ext/standard/tests/network/ip.phpt @@ -7,21 +7,20 @@ if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only"); --FILE-- getMessage(), PHP_EOL; +} +try { + var_dump(ip2long("127\00.0.1")); +} catch (Throwable $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} +?> +--EXPECT-- +ValueError: ip2long(): Argument #1 ($ip) must not be empty +ValueError: ip2long(): Argument #1 ($ip) must not contain any null bytes + diff --git a/ext/standard/tests/network/ip_x86_64.phpt b/ext/standard/tests/network/ip_x86_64.phpt index 16e855188aafa..58df8086577d3 100644 --- a/ext/standard/tests/network/ip_x86_64.phpt +++ b/ext/standard/tests/network/ip_x86_64.phpt @@ -7,21 +7,19 @@ if (PHP_INT_SIZE == 4) die("skip this test is for >32bit platform only"); --FILE--