@@ -854,6 +854,30 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_
854854 return true;
855855}
856856
857+ ZEND_ATTRIBUTE_NONNULL static bool zlib_get_long_option (HashTable * options , const char * option_name , size_t option_name_len , zend_long * value )
858+ {
859+ bool failed = false;
860+ zval * option_buffer = zend_hash_str_find (options , option_name , option_name_len );
861+
862+ if (!option_buffer ) {
863+ return true;
864+ }
865+
866+ /* The |H ZPP specifier may leave HashTable entries wrapped in IS_INDIRECT. */
867+ ZVAL_DEINDIRECT (option_buffer );
868+ * value = zval_try_get_long (option_buffer , & failed );
869+ if (UNEXPECTED (failed )) {
870+ zend_argument_type_error (
871+ 2 ,
872+ "the value for option \"%.*s\" must be of type int, %s given" ,
873+ (int ) option_name_len , option_name , zend_zval_value_name (option_buffer )
874+ );
875+ return false;
876+ }
877+
878+ return true;
879+ }
880+
857881/* {{{ Initialize an incremental inflate context with the specified encoding */
858882PHP_FUNCTION (inflate_init )
859883{
@@ -1080,49 +1104,38 @@ PHP_FUNCTION(deflate_init)
10801104 zend_long encoding , level = -1 , memory = 8 , window = 15 , strategy = Z_DEFAULT_STRATEGY ;
10811105 char * dict = NULL ;
10821106 size_t dictlen = 0 ;
1083- HashTable * options = NULL ;
1084- zval * option_buffer ;
1107+ HashTable * options = (HashTable * )& zend_empty_array ;
10851108
10861109 if (SUCCESS != zend_parse_parameters (ZEND_NUM_ARGS (), "l|H" , & encoding , & options )) {
10871110 RETURN_THROWS ();
10881111 }
10891112
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 );
1113+ if (!zlib_get_long_option (options , ZEND_STRL ("level" ), & level )) {
1114+ RETURN_THROWS ();
10931115 }
10941116 if (level < -1 || level > 9 ) {
10951117 zend_value_error ("deflate_init(): \"level\" option must be between -1 and 9" );
10961118 RETURN_THROWS ();
10971119 }
10981120
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 );
1121+ if (!zlib_get_long_option (options , ZEND_STRL ("memory" ), & memory )) {
1122+ RETURN_THROWS ();
11021123 }
11031124 if (memory < 1 || memory > 9 ) {
11041125 zend_value_error ("deflate_init(): \"memory\" option must be between 1 and 9" );
11051126 RETURN_THROWS ();
11061127 }
11071128
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 );
1129+ if (!zlib_get_long_option (options , ZEND_STRL ("window" ), & window )) {
1130+ RETURN_THROWS ();
11111131 }
11121132 if (window < 8 || window > 15 ) {
11131133 zend_value_error ("deflate_init(): \"window\" option must be between 8 and 15" );
11141134 RETURN_THROWS ();
11151135 }
11161136
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- }
1137+ if (!zlib_get_long_option (options , ZEND_STRL ("strategy" ), & strategy )) {
1138+ RETURN_THROWS ();
11261139 }
11271140 switch (strategy ) {
11281141 case Z_FILTERED :
0 commit comments