Skip to content

Commit 2711285

Browse files
committed
ext/gd: imagecrop/imageaffine checks matrix values overflow/underflow
1 parent 51379d6 commit 2711285

File tree

1 file changed

+50
-8
lines changed

1 file changed

+50
-8
lines changed

ext/gd/gd.c

Lines changed: 50 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3504,6 +3504,7 @@ PHP_FUNCTION(imagecrop)
35043504
gdRect rect;
35053505
zval *z_rect;
35063506
zval *tmp;
3507+
zend_long lval;
35073508

35083509
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oa", &IM, gd_image_ce, &z_rect) == FAILURE) {
35093510
RETURN_THROWS();
@@ -3512,28 +3513,48 @@ PHP_FUNCTION(imagecrop)
35123513
im = php_gd_libgdimageptr_from_zval_p(IM);
35133514

35143515
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "x", sizeof("x") -1)) != NULL) {
3515-
rect.x = zval_get_long(tmp);
3516+
lval = zval_get_long(tmp);
3517+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3518+
zend_argument_value_error(2, "invalid \"x\" key value");
3519+
RETURN_THROWS();
3520+
}
3521+
rect.x = lval;
35163522
} else {
35173523
zend_argument_value_error(2, "must have an \"x\" key");
35183524
RETURN_THROWS();
35193525
}
35203526

35213527
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "y", sizeof("y") - 1)) != NULL) {
3522-
rect.y = zval_get_long(tmp);
3528+
lval = zval_get_long(tmp);
3529+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3530+
zend_argument_value_error(2, "invalid \"y\" key value");
3531+
RETURN_THROWS();
3532+
}
3533+
rect.y = lval;
35233534
} else {
35243535
zend_argument_value_error(2, "must have a \"y\" key");
35253536
RETURN_THROWS();
35263537
}
35273538

35283539
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "width", sizeof("width") - 1)) != NULL) {
3529-
rect.width = zval_get_long(tmp);
3540+
lval = zval_get_long(tmp);
3541+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3542+
zend_argument_value_error(2, "invalid \"width\" key value");
3543+
RETURN_THROWS();
3544+
}
3545+
rect.width = lval;
35303546
} else {
35313547
zend_argument_value_error(2, "must have a \"width\" key");
35323548
RETURN_THROWS();
35333549
}
35343550

35353551
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "height", sizeof("height") - 1)) != NULL) {
3536-
rect.height = zval_get_long(tmp);
3552+
lval = zval_get_long(tmp);
3553+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3554+
zend_argument_value_error(2, "invalid \"height\" key value");
3555+
RETURN_THROWS();
3556+
}
3557+
rect.height = lval;
35373558
} else {
35383559
zend_argument_value_error(2, "must have a \"height\" key");
35393560
RETURN_THROWS();
@@ -3695,29 +3716,50 @@ PHP_FUNCTION(imageaffine)
36953716
}
36963717

36973718
if (z_rect != NULL) {
3719+
zend_long lval;
36983720
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "x", sizeof("x") - 1)) != NULL) {
3699-
rect.x = zval_get_long(tmp);
3721+
lval = zval_get_long(tmp);
3722+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3723+
zend_argument_value_error(3, "invalid \"x\" key value");
3724+
RETURN_THROWS();
3725+
}
3726+
rect.x = lval;
37003727
} else {
37013728
zend_argument_value_error(3, "must have an \"x\" key");
37023729
RETURN_THROWS();
37033730
}
37043731

37053732
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "y", sizeof("y") - 1)) != NULL) {
3706-
rect.y = zval_get_long(tmp);
3733+
lval = zval_get_long(tmp);
3734+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3735+
zend_argument_value_error(3, "invalid \"y\" key value");
3736+
RETURN_THROWS();
3737+
}
3738+
rect.y = lval;
37073739
} else {
37083740
zend_argument_value_error(3, "must have a \"y\" key");
37093741
RETURN_THROWS();
37103742
}
37113743

37123744
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "width", sizeof("width") - 1)) != NULL) {
3713-
rect.width = zval_get_long(tmp);
3745+
lval = zval_get_long(tmp);
3746+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3747+
zend_argument_value_error(3, "invalid \"width\" key value");
3748+
RETURN_THROWS();
3749+
}
3750+
rect.width = lval;
37143751
} else {
37153752
zend_argument_value_error(3, "must have a \"width\" key");
37163753
RETURN_THROWS();
37173754
}
37183755

37193756
if ((tmp = zend_hash_str_find(Z_ARRVAL_P(z_rect), "height", sizeof("height") - 1)) != NULL) {
3720-
rect.height = zval_get_long(tmp);
3757+
lval = zval_get_long(tmp);
3758+
if (ZEND_LONG_EXCEEDS_INT(lval)) {
3759+
zend_argument_value_error(3, "invalid \"height\" key value");
3760+
RETURN_THROWS();
3761+
}
3762+
rect.height = lval;
37213763
} else {
37223764
zend_argument_value_error(3, "must have a \"height\" key");
37233765
RETURN_THROWS();

0 commit comments

Comments
 (0)