Skip to content

Commit 8e7edeb

Browse files
committed
ext/gd: imagecrop rect argument overflow fixes.
``` ext/gd/libgd/gd.c:2275:14: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int' #0 0x5d6a2103e1db in php_gd_gdImageCopy /home/dcarlier/Contribs/php-src/ext/gd/libgd/gd.c:2275 #1 0x5d6a210a2b63 in gdImageCrop /home/dcarlier/Contribs/php-src/ext/gd/libgd/gd_crop.c:57 php#2 0x5d6a21018ca4 in zif_imagecrop /home/dcarlier/Contribs/php-src/ext/gd/gd.c:3575 php#3 0x5d6a21e46e7a in ZEND_DO_ICALL_SPEC_RETVAL_USED_HANDLER /home/dcarlier/Contribs/php-src/Zend/zend_vm_execute.h:1337 php#4 0x5d6a221188da in execute_ex /home/dcarlier/Contribs/php-src/Zend/zend_vm_execute.h:57246 php#5 0x5d6a221366bd in zend_execute /home/dcarlier/Contribs/php-src/Zend/zend_vm_execute.h:61634 php#6 0x5d6a21d107a6 in zend_execute_scripts /home/dcarlier/Contribs/php-src/Zend/zend.c:1895 php#7 0x5d6a21a63409 in php_execute_script /home/dcarlier/Contribs/php-src/main/main.c:2529 php#8 0x5d6a22516d5e in do_cli /home/dcarlier/Contribs/php-src/sapi/cli/php_cli.c:966 php#9 0x5d6a2251981d in main /home/dcarlier/Contribs/php-src/sapi/cli/php_cli.c:1341 php#10 0x7f10d002a3b7 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58 php#11 0x7f10d002a47a in __libc_start_main_impl ../csu/libc-start.c:360 php#12 0x5d6a20a06da4 in _start (/home/dcarlier/Contribs/php-src/sapi/cli/php+0x2806da4) (BuildId: d9a79c7e0e4872311439d7313cb3a81fe04190a2) ```
1 parent 9be9f70 commit 8e7edeb

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

ext/gd/gd.c

+10
Original file line numberDiff line numberDiff line change
@@ -3560,6 +3560,16 @@ PHP_FUNCTION(imagecrop)
35603560
RETURN_THROWS();
35613561
}
35623562

3563+
if ((rect.width > 0 && rect.x > INT_MAX - rect.width) || (rect.width < 0 && rect.x < INT_MIN - rect.width)) {
3564+
zend_argument_value_error(2, "overflow with \"x\" and \"width\" keys");
3565+
RETURN_THROWS();
3566+
}
3567+
3568+
if ((rect.height > 0 && rect.y > INT_MAX - rect.height) || (rect.height < 0 && rect.y < INT_MIN - rect.height)) {
3569+
zend_argument_value_error(2, "overflow with \"y\" and \"height\" keys");
3570+
RETURN_THROWS();
3571+
}
3572+
35633573
im_crop = gdImageCrop(im, &rect);
35643574

35653575
if (im_crop == NULL) {

ext/gd/tests/imagecrop_overflow.phpt

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
imagecrop() overflows when the combo x/width or y/height is over INT_MAX.
3+
--EXTENSIONS--
4+
gd
5+
--FILE--
6+
<?php
7+
$img = imagecreatetruecolor(10, 10);
8+
9+
$arr = array("x" => 2147483647, "y" => 2147483647, "width" => 10, "height" => 10);
10+
11+
try {
12+
imagecrop($img, $arr);
13+
} catch (\ValueError $e) {
14+
echo $e->getMessage() . PHP_EOL;
15+
}
16+
17+
$arr = array("x" => 1, "y" => 2147483647, "width" => 10, "height" => 10);
18+
try {
19+
imagecrop($img, $arr);
20+
} catch (\ValueError $e) {
21+
echo $e->getMessage();
22+
}
23+
?>
24+
--EXPECT--
25+
imagecrop(): Argument #2 ($rectangle) overflow with "x" and "width" keys
26+
imagecrop(): Argument #2 ($rectangle) overflow with "y" and "height" keys

0 commit comments

Comments
 (0)