@@ -796,62 +796,65 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_
796
796
* dict = emalloc (ZSTR_LEN (str ));
797
797
memcpy (* dict , ZSTR_VAL (str ), ZSTR_LEN (str ));
798
798
* dictlen = ZSTR_LEN (str );
799
- } break ;
799
+
800
+ return 1 ;
801
+ }
800
802
801
803
case IS_ARRAY : {
802
804
HashTable * dictionary = Z_ARR_P (option_buffer );
805
+ bool result = 1 ;
803
806
804
807
if (zend_hash_num_elements (dictionary ) > 0 ) {
805
- char * dictptr ;
806
- zval * cur ;
807
808
zend_string * * strings = safe_emalloc (zend_hash_num_elements (dictionary ), sizeof (zend_string * ), 0 );
808
- zend_string * * end , * * ptr = strings - 1 ;
809
+ size_t total = 0 ;
809
810
811
+ zval * cur ;
810
812
ZEND_HASH_FOREACH_VAL (dictionary , cur ) {
811
- * ++ ptr = zval_get_string (cur );
812
- ZEND_ASSERT (* ptr );
813
- if (ZSTR_LEN (* ptr ) == 0 || EG (exception )) {
814
- do {
815
- zend_string_release (* ptr );
816
- } while (-- ptr >= strings );
817
- efree (strings );
818
- if (!EG (exception )) {
819
- zend_argument_value_error (2 , "must not contain empty strings" );
820
- }
821
- return 0 ;
813
+ zend_string * string = zval_get_string (cur );
814
+ ZEND_ASSERT (string );
815
+ if (EG (exception )) {
816
+ result = 0 ;
817
+ break ;
818
+ }
819
+ if (ZSTR_LEN (string ) == 0 ) {
820
+ result = 0 ;
821
+ zend_argument_value_error (2 , "must not contain empty strings" );
822
+ break ;
822
823
}
823
- if (zend_str_has_nul_byte (* ptr )) {
824
- do {
825
- zend_string_release (* ptr );
826
- } while (-- ptr >= strings );
827
- efree (strings );
824
+ if (zend_str_has_nul_byte (string )) {
825
+ result = 0 ;
828
826
zend_argument_value_error (2 , "must not contain strings with null bytes" );
829
- return 0 ;
827
+ break ;
830
828
}
831
829
832
- * dictlen += ZSTR_LEN (* ptr ) + 1 ;
830
+ * dictlen += ZSTR_LEN (string ) + 1 ;
831
+ strings [total ] = string ;
832
+ total ++ ;
833
833
} ZEND_HASH_FOREACH_END ();
834
834
835
- dictptr = * dict = emalloc (* dictlen );
836
- ptr = strings ;
837
- end = strings + zend_hash_num_elements (dictionary );
838
- do {
839
- memcpy (dictptr , ZSTR_VAL (* ptr ), ZSTR_LEN (* ptr ));
840
- dictptr += ZSTR_LEN (* ptr );
835
+ char * dictptr = emalloc (* dictlen );
836
+ * dict = dictptr ;
837
+ for (size_t i = 0 ; i < total ; i ++ ) {
838
+ zend_string * string = strings [i ];
839
+ dictptr = zend_mempcpy (dictptr , ZSTR_VAL (string ), ZSTR_LEN (string ));
841
840
* dictptr ++ = 0 ;
842
- zend_string_release_ex ( * ptr , 0 );
843
- } while ( ++ ptr != end );
841
+ zend_string_release ( string );
842
+ }
844
843
efree (strings );
844
+ if (!result ) {
845
+ efree (* dict );
846
+ * dict = NULL ;
847
+ }
845
848
}
846
- } break ;
849
+
850
+ return result ;
851
+ }
847
852
848
853
default :
849
854
zend_argument_type_error (2 , "must be of type zero-terminated string or array, %s given" , zend_zval_value_name (option_buffer ));
850
855
return 0 ;
851
856
}
852
857
}
853
-
854
- return 1 ;
855
858
}
856
859
857
860
/* {{{ Initialize an incremental inflate context with the specified encoding */
0 commit comments