Commit fd8da80e50b for php
commit fd8da80e50bfdd868d422e3cf9e073f306652571
Author: Gina Peter Banyard <girgias@php.net>
Date: Sat Nov 29 14:43:49 2025 +0000
ext/standard/basic_functions.c: handle time_nanosleep() inputs ahead of time
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 0f85249ceb7..b8c488ae276 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -1177,8 +1177,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();
}
@@ -1192,10 +1192,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 740a68b8344..12bf4e32c01 100644
--- a/ext/standard/tests/misc/time_nanosleep_error4.phpt
+++ b/ext/standard/tests/misc/time_nanosleep_error4.phpt
@@ -10,12 +10,12 @@
--FILE--
<?php
-time_nanosleep(0, -10);
+try {
+ time_nanosleep(0, -10);
+} catch (ValueError $exception) {
+ echo $exception->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 7116da5519c..2c374388a63 100644
--- a/ext/standard/tests/misc/time_nanosleep_error5.phpt
+++ b/ext/standard/tests/misc/time_nanosleep_error5.phpt
@@ -7,12 +7,12 @@
--FILE--
<?php
-time_nanosleep(0, 1000000000);
+try {
+ time_nanosleep(0, 1000000000);
+} catch (ValueError $exception) {
+ echo $exception->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 22ae73ad086..0f248612844 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--
<?php
- try {
- time_nanosleep(-1, 0);
- } catch (Throwable $exception) {
- echo $exception::class, ': ', $exception->getMessage(), "\n";
- }
+try {
+ time_nanosleep(-1, 0);
+} catch (Throwable $exception) {
+ echo $exception::class, ': ', $exception->getMessage(), "\n";
+}
- try {
- time_nanosleep(0, -1);
- } catch (Throwable $exception) {
- echo $exception::class, ': ', $exception->getMessage(), "\n";
- }
+try {
+ time_nanosleep(0, -1);
+} catch (Throwable $exception) {
+ echo $exception::class, ': ', $exception->getMessage(), "\n";
+}
?>
--EXPECT--
ValueError: time_nanosleep(): Argument #1 ($seconds) must be greater than or equal to 0
-ValueError: time_nanosleep(): Argument #2 ($nanoseconds) must be greater than or equal to 0
+ValueError: time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999