@@ -640,7 +640,20 @@ PHP_FUNCTION(imagesetstyle)
640640 stylearr = safe_emalloc (num_styles , sizeof (int ), 0 );
641641
642642 ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (styles ), item ) {
643- stylearr [index ++ ] = zval_get_long (item );
643+ bool failed = false;
644+ ZVAL_DEREF (item );
645+ zend_long tmp = zval_try_get_long (item , & failed );
646+ if (failed ) {
647+ efree (stylearr );
648+ zend_argument_type_error (2 , "must only have elements of type int, %s given" , zend_zval_type_name (item ));
649+ RETURN_THROWS ();
650+ }
651+ if (ZEND_LONG_EXCEEDS_INT (tmp )) {
652+ efree (stylearr );
653+ zend_argument_type_error (2 , "elements must be between %d and %d" , INT_MIN , INT_MAX );
654+ RETURN_THROWS ();
655+ }
656+ stylearr [index ++ ] = (int ) tmp ;
644657 } ZEND_HASH_FOREACH_END ();
645658
646659 gdImageSetStyle (im , stylearr , index );
@@ -3595,7 +3608,20 @@ static void php_image_filter_scatter(INTERNAL_FUNCTION_PARAMETERS)
35953608 colors = safe_emalloc (num_colors , sizeof (int ), 0 );
35963609
35973610 ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (hash_colors ), color ) {
3598- * (colors + i ++ ) = (int ) zval_get_long (color );
3611+ bool failed = false;
3612+ ZVAL_DEREF (color );
3613+ zend_long tmp = zval_try_get_long (color , & failed );
3614+ if (failed ) {
3615+ efree (colors );
3616+ zend_argument_value_error (5 , "value must be of type int, %s given" , zend_zval_type_name (color ));
3617+ RETURN_THROWS ();
3618+ }
3619+ if (tmp < 0 || ZEND_LONG_INT_OVFL (tmp )) {
3620+ efree (colors );
3621+ zend_argument_value_error (5 , "value must be between 0 and %d" , INT_MAX );
3622+ RETURN_THROWS ();
3623+ }
3624+ colors [i ++ ] = (int ) tmp ;
35993625 } ZEND_HASH_FOREACH_END ();
36003626
36013627 RETVAL_BOOL (gdImageScatterColor (im , (int )scatter_sub , (int )scatter_plus , colors , num_colors ));
@@ -3763,6 +3789,23 @@ PHP_FUNCTION(imageantialias)
37633789}
37643790/* }}} */
37653791
3792+ static bool php_gd_zval_try_get_c_int (zval * tmp , const char * field , int * res ) {
3793+ zend_long r ;
3794+ bool failed = false;
3795+ ZVAL_DEREF (tmp );
3796+ r = zval_try_get_long (tmp , & failed );
3797+ if (failed ) {
3798+ zend_argument_value_error (2 , "\"%s\" key must be of type int, %s given" , field , zend_zval_type_name (tmp ));
3799+ return false;
3800+ }
3801+ if (UNEXPECTED (ZEND_LONG_EXCEEDS_INT (r ))) {
3802+ zend_argument_value_error (2 , "\"%s\" key must be between %d and %d" , field , INT_MIN , INT_MAX );
3803+ return false;
3804+ }
3805+ * res = (int )r ;
3806+ return true;
3807+ }
3808+
37663809/* {{{ Crop an image using the given coordinates and size, x, y, width and height. */
37673810PHP_FUNCTION (imagecrop )
37683811{
@@ -3781,28 +3824,36 @@ PHP_FUNCTION(imagecrop)
37813824 im = php_gd_libgdimageptr_from_zval_p (IM );
37823825
37833826 if ((tmp = zend_hash_str_find (Z_ARRVAL_P (z_rect ), "x" , sizeof ("x" ) - 1 )) != NULL ) {
3784- rect .x = zval_get_long (tmp );
3827+ if (!php_gd_zval_try_get_c_int (tmp , "x" , & rect .x )) {
3828+ RETURN_THROWS ();
3829+ }
37853830 } else {
37863831 zend_argument_value_error (2 , "must have an \"x\" key" );
37873832 RETURN_THROWS ();
37883833 }
37893834
37903835 if ((tmp = zend_hash_str_find (Z_ARRVAL_P (z_rect ), "y" , sizeof ("y" ) - 1 )) != NULL ) {
3791- rect .y = zval_get_long (tmp );
3836+ if (!php_gd_zval_try_get_c_int (tmp , "y" , & rect .y )) {
3837+ RETURN_THROWS ();
3838+ }
37923839 } else {
37933840 zend_argument_value_error (2 , "must have a \"y\" key" );
37943841 RETURN_THROWS ();
37953842 }
37963843
37973844 if ((tmp = zend_hash_str_find (Z_ARRVAL_P (z_rect ), "width" , sizeof ("width" ) - 1 )) != NULL ) {
3798- rect .width = zval_get_long (tmp );
3845+ if (!php_gd_zval_try_get_c_int (tmp , "width" , & rect .width )) {
3846+ RETURN_THROWS ();
3847+ }
37993848 } else {
38003849 zend_argument_value_error (2 , "must have a \"width\" key" );
38013850 RETURN_THROWS ();
38023851 }
38033852
38043853 if ((tmp = zend_hash_str_find (Z_ARRVAL_P (z_rect ), "height" , sizeof ("height" ) - 1 )) != NULL ) {
3805- rect .height = zval_get_long (tmp );
3854+ if (!php_gd_zval_try_get_c_int (tmp , "height" , & rect .height )) {
3855+ RETURN_THROWS ();
3856+ }
38063857 } else {
38073858 zend_argument_value_error (2 , "must have a \"height\" key" );
38083859 RETURN_THROWS ();
0 commit comments