Skip to content

Commit abb778b

Browse files
committed
Fix GH-15613: unpack on format hex strings repeater value.
1 parent eb87de1 commit abb778b

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

ext/standard/pack.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,13 @@ PHP_FUNCTION(unpack)
979979
zend_string *buf;
980980
zend_long ipos, opos;
981981

982+
983+
if (ZEND_LONG_INT_OVFL((zend_long)size * 2)) {
984+
zend_string_release(real_name);
985+
zend_argument_value_error(1, "repeater must be less than or equal to %d", INT_MAX / 2);
986+
RETURN_THROWS();
987+
}
988+
982989
/* If size was given take minimum of len and size */
983990
if (size >= 0 && len > (size * 2)) {
984991
len = size * 2;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
GH-15613 overflow on hex strings repeater value
3+
--INI--
4+
memory_limit=-1
5+
--FILE--
6+
<?php
7+
try {
8+
unpack('h2147483647', str_repeat('X', 2**31 + 10));
9+
} catch (\ValueError $e) {
10+
echo $e->getMessage() . PHP_EOL;
11+
}
12+
13+
try {
14+
unpack('H2147483647', str_repeat('X', 2**31 + 10));
15+
} catch (\ValueError $e) {
16+
echo $e->getMessage();
17+
}
18+
?>
19+
--EXPECTF--
20+
unpack(): Argument #1 ($format) repeater must be less than or equal to %d
21+
unpack(): Argument #1 ($format) repeater must be less than or equal to %d

0 commit comments

Comments
 (0)