@@ -796,61 +796,62 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_
796796 * dict = emalloc (ZSTR_LEN (str ));
797797 memcpy (* dict , ZSTR_VAL (str ), ZSTR_LEN (str ));
798798 * dictlen = ZSTR_LEN (str );
799- } break ;
799+
800+ return 1 ;
801+ }
800802
801803 case IS_ARRAY : {
802804 HashTable * dictionary = Z_ARR_P (option_buffer );
805+ bool result = 1 ;
803806
804807 if (zend_hash_num_elements (dictionary ) > 0 ) {
805- char * dictptr ;
806- zval * cur ;
807808 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 ;
809810
811+ zval * cur ;
810812 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_try_get_string (cur );
814+ if ( string == NULL ) {
815+ result = 0 ;
816+ break ;
817+ }
818+ * dictlen += ZSTR_LEN ( string ) + 1 ;
819+ strings [ total ++ ] = string ;
820+ if (ZSTR_LEN ( string ) == 0 ) {
821+ result = 0 ;
822+ zend_argument_value_error ( 2 , "must not contain empty strings" );
823+ break ;
822824 }
823- if (zend_str_has_nul_byte (* ptr )) {
824- do {
825- zend_string_release (* ptr );
826- } while (-- ptr >= strings );
827- efree (strings );
825+ if (zend_str_has_nul_byte (string )) {
826+ result = 0 ;
828827 zend_argument_value_error (2 , "must not contain strings with null bytes" );
829- return 0 ;
828+ break ;
830829 }
831-
832- * dictlen += ZSTR_LEN (* ptr ) + 1 ;
833830 } ZEND_HASH_FOREACH_END ();
834831
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 );
832+ char * dictptr = emalloc (* dictlen );
833+ * dict = dictptr ;
834+ for (size_t i = 0 ; i < total ; i ++ ) {
835+ zend_string * string = strings [i ];
836+ dictptr = zend_mempcpy (dictptr , ZSTR_VAL (string ), ZSTR_LEN (string ));
841837 * dictptr ++ = 0 ;
842- zend_string_release_ex ( * ptr , 0 );
843- } while ( ++ ptr != end );
838+ zend_string_release ( string );
839+ }
844840 efree (strings );
841+ if (!result ) {
842+ efree (* dict );
843+ * dict = NULL ;
844+ }
845845 }
846- } break ;
846+
847+ return result ;
848+ }
847849
848850 default :
849851 zend_argument_type_error (2 , "must be of type zero-terminated string or array, %s given" , zend_zval_value_name (option_buffer ));
850852 return 0 ;
851853 }
852854 }
853-
854855 return 1 ;
855856}
856857
0 commit comments