Skip to content

Commit 60461ad

Browse files
committed
ext/pcntl: use RETURN_THROWS() instead of RETURN_FALSE when exception is pending
In pcntl_sigprocmask(), pcntl_sigwaitinfo(), and pcntl_sigtimedwait().
1 parent f073425 commit 60461ad

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

ext/pcntl/pcntl.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,9 @@ PHP_FUNCTION(pcntl_sigprocmask)
934934
bool status = php_pcntl_set_user_signal_infos(user_set, &set, 2, /* allow_empty_signal_array */ how == SIG_SETMASK);
935935
/* Some error occurred */
936936
if (!status) {
937+
if (EG(exception)) {
938+
RETURN_THROWS();
939+
}
937940
RETURN_FALSE;
938941
}
939942

@@ -982,6 +985,9 @@ PHP_FUNCTION(pcntl_sigwaitinfo)
982985
bool status = php_pcntl_set_user_signal_infos(user_set, &set, 1, /* allow_empty_signal_array */ false);
983986
/* Some error occurred */
984987
if (!status) {
988+
if (EG(exception)) {
989+
RETURN_THROWS();
990+
}
985991
RETURN_FALSE;
986992
}
987993

@@ -1028,6 +1034,9 @@ PHP_FUNCTION(pcntl_sigtimedwait)
10281034
bool status = php_pcntl_set_user_signal_infos(user_set, &set, 1, /* allow_empty_signal_array */ false);
10291035
/* Some error occurred */
10301036
if (!status) {
1037+
if (EG(exception)) {
1038+
RETURN_THROWS();
1039+
}
10311040
RETURN_FALSE;
10321041
}
10331042
if (tv_sec < 0) {
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
--TEST--
2+
pcntl_sigprocmask(), pcntl_sigwaitinfo(), and pcntl_sigtimedwait() properly throw on invalid signals
3+
--EXTENSIONS--
4+
pcntl
5+
--SKIPIF--
6+
<?php
7+
if (!function_exists("pcntl_sigprocmask")) die("skip pcntl_sigprocmask() not available");
8+
if (!function_exists("pcntl_sigwaitinfo")) die("skip pcntl_sigwaitinfo() not available");
9+
if (!function_exists("pcntl_sigtimedwait")) die("skip pcntl_sigtimedwait() not available");
10+
?>
11+
--INI--
12+
max_execution_time=0
13+
--FILE--
14+
<?php
15+
16+
try {
17+
pcntl_sigprocmask(SIG_BLOCK, ["not_a_signal"]);
18+
} catch (TypeError $e) {
19+
echo $e->getMessage() . PHP_EOL;
20+
}
21+
22+
try {
23+
pcntl_sigprocmask(SIG_BLOCK, [0]);
24+
} catch (ValueError $e) {
25+
echo $e->getMessage() . PHP_EOL;
26+
}
27+
28+
try {
29+
pcntl_sigprocmask(SIG_BLOCK, []);
30+
} catch (ValueError $e) {
31+
echo $e->getMessage() . PHP_EOL;
32+
}
33+
34+
try {
35+
pcntl_sigwaitinfo(["not_a_signal"]);
36+
} catch (TypeError $e) {
37+
echo $e->getMessage() . PHP_EOL;
38+
}
39+
40+
try {
41+
pcntl_sigwaitinfo([0]);
42+
} catch (ValueError $e) {
43+
echo $e->getMessage() . PHP_EOL;
44+
}
45+
46+
try {
47+
pcntl_sigwaitinfo([]);
48+
} catch (ValueError $e) {
49+
echo $e->getMessage() . PHP_EOL;
50+
}
51+
52+
try {
53+
pcntl_sigtimedwait(["not_a_signal"], $info, 1);
54+
} catch (TypeError $e) {
55+
echo $e->getMessage() . PHP_EOL;
56+
}
57+
58+
try {
59+
pcntl_sigtimedwait([0], $info, 1);
60+
} catch (ValueError $e) {
61+
echo $e->getMessage() . PHP_EOL;
62+
}
63+
64+
try {
65+
pcntl_sigtimedwait([], $info, 1);
66+
} catch (ValueError $e) {
67+
echo $e->getMessage() . PHP_EOL;
68+
}
69+
70+
?>
71+
--EXPECTF--
72+
pcntl_sigprocmask(): Argument #2 ($signals) signals must be of type int, string given
73+
pcntl_sigprocmask(): Argument #2 ($signals) signals must be between 1 and %d
74+
pcntl_sigprocmask(): Argument #2 ($signals) must not be empty
75+
pcntl_sigwaitinfo(): Argument #1 ($signals) signals must be of type int, string given
76+
pcntl_sigwaitinfo(): Argument #1 ($signals) signals must be between 1 and %d
77+
pcntl_sigwaitinfo(): Argument #1 ($signals) must not be empty
78+
pcntl_sigtimedwait(): Argument #1 ($signals) signals must be of type int, string given
79+
pcntl_sigtimedwait(): Argument #1 ($signals) signals must be between 1 and %d
80+
pcntl_sigtimedwait(): Argument #1 ($signals) must not be empty

0 commit comments

Comments
 (0)