@@ -3534,7 +3534,7 @@ redis_mbulk_reply_zipped_raw_variant(RedisSock *redis_sock, zval *zret, int coun
3534
3534
PHP_REDIS_API int redis_mbulk_reply_assoc (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx )
3535
3535
{
3536
3536
char * response ;
3537
- int response_len ;
3537
+ int response_len , retval ;
3538
3538
int i , numElems ;
3539
3539
3540
3540
zval * z_keys = ctx ;
@@ -3545,44 +3545,46 @@ PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSoc
3545
3545
} else {
3546
3546
add_next_index_bool (z_tab , 0 );
3547
3547
}
3548
- goto failure ;
3548
+ retval = FAILURE ;
3549
+ goto end ;
3549
3550
}
3551
+
3550
3552
zval z_multi_result ;
3551
- array_init (& z_multi_result ); /* pre-allocate array for multi's results. */
3553
+ array_init_size (& z_multi_result , numElems ); /* pre-allocate array for multi's results. */
3552
3554
3553
3555
for (i = 0 ; i < numElems ; ++ i ) {
3554
- zend_string * zstr = zval_get_string (& z_keys [i ]);
3556
+ zend_string * tmp_str ;
3557
+ zend_string * zstr = zval_get_tmp_string (& z_keys [i ], & tmp_str );
3555
3558
response = redis_sock_read (redis_sock , & response_len );
3556
- if (response != NULL ) {
3557
- zval z_unpacked ;
3558
- if (redis_unpack (redis_sock , response , response_len , & z_unpacked )) {
3559
- add_assoc_zval_ex (& z_multi_result , ZSTR_VAL (zstr ), ZSTR_LEN (zstr ), & z_unpacked );
3560
- } else {
3561
- add_assoc_stringl_ex (& z_multi_result , ZSTR_VAL (zstr ), ZSTR_LEN (zstr ), response , response_len );
3559
+ zval z_unpacked ;
3560
+ if (response != NULL ) {
3561
+ if (!redis_unpack (redis_sock , response , response_len , & z_unpacked )) {
3562
+ ZVAL_STRINGL (& z_unpacked , response , response_len );
3562
3563
}
3563
3564
efree (response );
3564
3565
} else {
3565
- add_assoc_bool_ex ( & z_multi_result , ZSTR_VAL ( zstr ), ZSTR_LEN ( zstr ), 0 );
3566
+ ZVAL_FALSE ( & z_unpacked );
3566
3567
}
3567
- zend_string_release ( zstr );
3568
- zval_dtor ( & z_keys [ i ] );
3568
+ zend_symtable_update ( Z_ARRVAL ( z_multi_result ), zstr , & z_unpacked );
3569
+ zend_tmp_string_release ( tmp_str );
3569
3570
}
3570
- efree (z_keys );
3571
3571
3572
3572
if (IS_ATOMIC (redis_sock )) {
3573
3573
RETVAL_ZVAL (& z_multi_result , 0 , 1 );
3574
3574
} else {
3575
3575
add_next_index_zval (z_tab , & z_multi_result );
3576
3576
}
3577
- return SUCCESS ;
3578
- failure :
3579
- if ( z_keys != NULL ) {
3580
- for ( i = 0 ; Z_TYPE ( z_keys [ i ]) != IS_NULL ; ++ i ) {
3581
- zval_dtor ( & z_keys [ i ]);
3582
- }
3583
- efree ( z_keys );
3577
+
3578
+ retval = SUCCESS ;
3579
+
3580
+ end :
3581
+ // Cleanup z_keys
3582
+ for ( i = 0 ; Z_TYPE ( z_keys [ i ]) != IS_NULL ; ++ i ) {
3583
+ zval_dtor ( & z_keys [ i ] );
3584
3584
}
3585
- return FAILURE ;
3585
+ efree (z_keys );
3586
+
3587
+ return retval ;
3586
3588
}
3587
3589
3588
3590
/**
0 commit comments