@@ -854,6 +854,29 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_
854854 return true;
855855}
856856
857+ static bool zlib_get_long_option (HashTable * options , const char * option_name , size_t option_name_len , zend_long * value )
858+ {
859+ zval * option_buffer ;
860+ bool failed = false;
861+
862+ if (!options || (option_buffer = zend_hash_str_find (options , option_name , option_name_len )) == NULL ) {
863+ return true;
864+ }
865+
866+ ZVAL_DEINDIRECT (option_buffer );
867+ * value = zval_try_get_long (option_buffer , & failed );
868+ if (UNEXPECTED (failed )) {
869+ zend_argument_type_error (
870+ 2 ,
871+ "the value for option \"%.*s\" must be of type int, %s given" ,
872+ (int ) option_name_len , option_name , zend_zval_value_name (option_buffer )
873+ );
874+ return false;
875+ }
876+
877+ return true;
878+ }
879+
857880/* {{{ Initialize an incremental inflate context with the specified encoding */
858881PHP_FUNCTION (inflate_init )
859882{
@@ -1081,48 +1104,37 @@ PHP_FUNCTION(deflate_init)
10811104 char * dict = NULL ;
10821105 size_t dictlen = 0 ;
10831106 HashTable * options = NULL ;
1084- zval * option_buffer ;
10851107
10861108 if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "l|H" , & encoding , & options )) {
10871109 RETURN_THROWS ();
10881110 }
10891111
1090- if (options && (option_buffer = zend_hash_str_find (options , ZEND_STRL ("level" ))) != NULL ) {
1091- ZVAL_DEINDIRECT (option_buffer );
1092- level = zval_get_long (option_buffer );
1112+ if (!zlib_get_long_option (options , ZEND_STRL ("level" ), & level )) {
1113+ RETURN_THROWS ();
10931114 }
10941115 if (level < -1 || level > 9 ) {
10951116 zend_value_error ("deflate_init(): \"level\" option must be between -1 and 9" );
10961117 RETURN_THROWS ();
10971118 }
10981119
1099- if (options && (option_buffer = zend_hash_str_find (options , ZEND_STRL ("memory" ))) != NULL ) {
1100- ZVAL_DEINDIRECT (option_buffer );
1101- memory = zval_get_long (option_buffer );
1120+ if (!zlib_get_long_option (options , ZEND_STRL ("memory" ), & memory )) {
1121+ RETURN_THROWS ();
11021122 }
11031123 if (memory < 1 || memory > 9 ) {
11041124 zend_value_error ("deflate_init(): \"memory\" option must be between 1 and 9" );
11051125 RETURN_THROWS ();
11061126 }
11071127
1108- if (options && (option_buffer = zend_hash_str_find (options , ZEND_STRL ("window" ))) != NULL ) {
1109- ZVAL_DEINDIRECT (option_buffer );
1110- window = zval_get_long (option_buffer );
1128+ if (!zlib_get_long_option (options , ZEND_STRL ("window" ), & window )) {
1129+ RETURN_THROWS ();
11111130 }
11121131 if (window < 8 || window > 15 ) {
11131132 zend_value_error ("deflate_init(): \"window\" option must be between 8 and 15" );
11141133 RETURN_THROWS ();
11151134 }
11161135
1117- if (options && (option_buffer = zend_hash_str_find (options , ZEND_STRL ("strategy" ))) != NULL ) {
1118- bool failed = false;
1119-
1120- ZVAL_DEINDIRECT (option_buffer );
1121- strategy = zval_try_get_long (option_buffer , & failed );
1122- if (UNEXPECTED (failed )) {
1123- zend_argument_type_error (2 , "the value for option \"strategy\" must be of type int, %s given" , zend_zval_value_name (option_buffer ));
1124- RETURN_THROWS ();
1125- }
1136+ if (!zlib_get_long_option (options , ZEND_STRL ("strategy" ), & strategy )) {
1137+ RETURN_THROWS ();
11261138 }
11271139 switch (strategy ) {
11281140 case Z_FILTERED :
0 commit comments