Skip to content

Commit 0528a1d

Browse files
committed
ext/standard/basic_functions.c: handle time_nanosleep() inputs ahead of time
1 parent 80e7246 commit 0528a1d

File tree

4 files changed

+28
-30
lines changed

4 files changed

+28
-30
lines changed

ext/standard/basic_functions.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,8 +1158,8 @@ PHP_FUNCTION(time_nanosleep)
11581158
zend_argument_value_error(1, "must be greater than or equal to 0");
11591159
RETURN_THROWS();
11601160
}
1161-
if (tv_nsec < 0) {
1162-
zend_argument_value_error(2, "must be greater than or equal to 0");
1161+
if (tv_nsec < 0 || tv_nsec > 999999999) {
1162+
zend_argument_value_error(2, "must be between 0 and 999999999");
11631163
RETURN_THROWS();
11641164
}
11651165

@@ -1173,10 +1173,8 @@ PHP_FUNCTION(time_nanosleep)
11731173
add_assoc_long_ex(return_value, "seconds", sizeof("seconds")-1, php_rem.tv_sec);
11741174
add_assoc_long_ex(return_value, "nanoseconds", sizeof("nanoseconds")-1, php_rem.tv_nsec);
11751175
return;
1176-
} else if (errno == EINVAL) {
1177-
zend_value_error("Nanoseconds was not in the range 0 to 999 999 999 or seconds was negative");
1178-
RETURN_THROWS();
11791176
}
1177+
ZEND_ASSERT(errno != EINVAL);
11801178

11811179
RETURN_FALSE;
11821180
}

ext/standard/tests/misc/time_nanosleep_error4.phpt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ if (!function_exists('time_nanosleep')) die("skip");
1010
--FILE--
1111
<?php
1212

13-
time_nanosleep(0, -10);
13+
try {
14+
time_nanosleep(0, -10);
15+
} catch (ValueError $exception) {
16+
echo $exception->getMessage(), "\n";
17+
}
1418

1519
?>
16-
--EXPECTF--
17-
Fatal error: Uncaught ValueError: time_nanosleep(): Argument #2 ($nanoseconds) must be greater than or equal to 0 in %s:%d
18-
Stack trace:
19-
#0 %s(%d): time_nanosleep(0, -10)
20-
#1 {main}
21-
thrown in %s on line %d
20+
--EXPECT--
21+
time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999

ext/standard/tests/misc/time_nanosleep_error5.phpt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ time_nanosleep — Delay for a number of seconds and nanoseconds
77
--FILE--
88
<?php
99

10-
time_nanosleep(0, 1000000000);
10+
try {
11+
time_nanosleep(0, 1000000000);
12+
} catch (ValueError $exception) {
13+
echo $exception->getMessage(), "\n";
14+
}
1115

1216
?>
13-
--EXPECTF--
14-
Fatal error: Uncaught ValueError: Nanoseconds was not in the range 0 to 999 999 999 or seconds was negative in %s:%d
15-
Stack trace:
16-
#0 %s(%d): time_nanosleep(0, 1000000000)
17-
#1 {main}
18-
thrown in %s on line %d
17+
--EXPECT--
18+
time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999

ext/standard/tests/time/bug60222.phpt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
Bug #60222 (time_nanosleep() does validate input params)
33
--FILE--
44
<?php
5-
try {
6-
time_nanosleep(-1, 0);
7-
} catch (ValueError $exception) {
8-
echo $exception->getMessage() . "\n";
9-
}
5+
try {
6+
time_nanosleep(-1, 0);
7+
} catch (ValueError $exception) {
8+
echo $exception->getMessage() . "\n";
9+
}
1010

11-
try {
12-
time_nanosleep(0, -1);
13-
} catch (ValueError $exception) {
14-
echo $exception->getMessage() . "\n";
15-
}
11+
try {
12+
time_nanosleep(0, -1);
13+
} catch (ValueError $exception) {
14+
echo $exception->getMessage() . "\n";
15+
}
1616
?>
1717
--EXPECT--
1818
time_nanosleep(): Argument #1 ($seconds) must be greater than or equal to 0
19-
time_nanosleep(): Argument #2 ($nanoseconds) must be greater than or equal to 0
19+
time_nanosleep(): Argument #2 ($nanoseconds) must be between 0 and 999999999

0 commit comments

Comments
 (0)