Skip to content

Commit 317acb6

Browse files
committed
Io\Poll\Context::wait() max events range check
1 parent 846773a commit 317acb6

3 files changed

Lines changed: 44 additions & 2 deletions

File tree

ext/standard/io_poll.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -804,12 +804,17 @@ PHP_METHOD(Io_Poll_Context, wait)
804804
if (max_events <= 0) {
805805
max_events = 64;
806806
}
807-
} else if (max_events <= 0) {
807+
} else if (UNEXPECTED(max_events <= 0)) {
808808
zend_argument_value_error(2, "must be greater than 0");
809809
RETURN_THROWS();
810+
#if SIZEOF_INT < SIZEOF_ZEND_LONG
811+
} else if (UNEXPECTED(max_events > INT_MAX)) {
812+
zend_argument_value_error(2, "must be less than or equal to %d", INT_MAX);
813+
RETURN_THROWS();
814+
#endif
810815
}
811816

812-
php_poll_event *events = safe_emalloc(max_events, sizeof(*events), 0);
817+
php_poll_event *events = safe_emalloc((size_t) max_events, sizeof(*events), 0);
813818
int num_events = php_poll_wait(intern->ctx, events, (int) max_events, timeout ? &timeout_ts : NULL);
814819

815820
if (num_events < 0) {

ext/standard/tests/poll/poll_ctx_wait.phpt renamed to ext/standard/tests/poll/poll_ctx_wait_error.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,27 @@ try {
1212
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
1313
}
1414

15+
try {
16+
$poll_ctx->wait(maxEvents: PHP_INT_MIN);
17+
} catch (Throwable $e) {
18+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
19+
}
20+
1521
try {
1622
$poll_ctx->wait(maxEvents: -1);
1723
} catch (Throwable $e) {
1824
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
1925
}
2026

27+
try {
28+
$poll_ctx->wait(maxEvents: 0);
29+
} catch (Throwable $e) {
30+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
31+
}
32+
2133
?>
2234
--EXPECT--
2335
ValueError: Io\Poll\Context::wait(): Argument #1 ($timeout) must not be negative
2436
ValueError: Io\Poll\Context::wait(): Argument #2 ($maxEvents) must be greater than 0
37+
ValueError: Io\Poll\Context::wait(): Argument #2 ($maxEvents) must be greater than 0
38+
ValueError: Io\Poll\Context::wait(): Argument #2 ($maxEvents) must be greater than 0
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
--TEST--
2+
Io\Poll\Context::wait(): Parameter validation upper limit
3+
--SKIPIF--
4+
<?php
5+
if (PHP_INT_SIZE <= 4) {
6+
die("skip this test is for > 32bit platforms only");
7+
}
8+
?>
9+
--FILE--
10+
<?php
11+
require_once __DIR__ . '/poll.inc';
12+
13+
$poll_ctx = new Io\Poll\Context();
14+
15+
try {
16+
$poll_ctx->wait(maxEvents: PHP_INT_MAX);
17+
} catch (Throwable $e) {
18+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
19+
}
20+
21+
?>
22+
--EXPECTF--
23+
ValueError: Io\Poll\Context::wait(): Argument #2 ($maxEvents) must be less than or equal to %d

0 commit comments

Comments
 (0)