@@ -609,7 +609,7 @@ PHP_METHOD(SplFixedArray, __serialize)
609609
610610 /* members */
611611 ZEND_HASH_FOREACH_STR_KEY_VAL (intern -> std .properties , key , current ) {
612- zend_hash_str_add (Z_ARRVAL_P (return_value ), ZSTR_VAL ( key ), ZSTR_LEN ( key ) , current );
612+ zend_hash_add (Z_ARRVAL_P (return_value ), key , current );
613613 Z_TRY_ADDREF_P (current );
614614 } ZEND_HASH_FOREACH_END ();
615615}
@@ -620,7 +620,7 @@ PHP_METHOD(SplFixedArray, __unserialize)
620620 HashTable * data ;
621621 zval members_zv , * elem ;
622622 zend_string * key ;
623- zend_long idx , size , array_size ;
623+ zend_long idx , size ;
624624
625625 if (zend_parse_parameters (ZEND_NUM_ARGS (), "h" , & data ) == FAILURE ) {
626626 RETURN_THROWS ();
@@ -631,20 +631,23 @@ PHP_METHOD(SplFixedArray, __unserialize)
631631 spl_fixedarray_init_non_empty_struct (& intern -> array , size );
632632 array_init (& members_zv );
633633
634- array_size = 0 ;
634+ intern -> array . size = 0 ;
635635 ZEND_HASH_FOREACH_KEY_VAL (data , idx , key , elem ) {
636636 if (key == NULL ) {
637- ZVAL_COPY (& intern -> array .elements [idx ], elem );
638- array_size ++ ;
637+ ZVAL_COPY (& intern -> array .elements [intern -> array . size ], elem );
638+ intern -> array . size ++ ;
639639 } else {
640- zval tmp ;
641- ZVAL_COPY (& tmp , elem );
642- zend_hash_add (Z_ARRVAL (members_zv ), key , & tmp );
640+ Z_TRY_ADDREF_P (elem );
641+ zend_hash_add (Z_ARRVAL (members_zv ), key , elem );
643642 }
644643 } ZEND_HASH_FOREACH_END ();
645644
646- intern -> array .elements = erealloc (intern -> array .elements , sizeof (zval ) * array_size );
647- intern -> array .size = array_size ;
645+ if (intern -> array .size ) {
646+ intern -> array .elements = erealloc (intern -> array .elements , sizeof (zval ) * intern -> array .size );
647+ } else {
648+ efree (intern -> array .elements );
649+ intern -> array .elements = NULL ;
650+ }
648651
649652 object_properties_load (& intern -> std , Z_ARRVAL (members_zv ));
650653 zval_ptr_dtor (& members_zv );
0 commit comments