@@ -493,25 +493,25 @@ static void
493493ra_index_change_keys (const char * cmd , zval * z_keys , zval * z_redis TSRMLS_DC ) {
494494
495495 int i , argc ;
496- zval z_fun , z_ret ;
496+ zval z_fun , z_ret , * * z_args ;
497497
498498 /* alloc */
499499 argc = 1 + zend_hash_num_elements (Z_ARRVAL_P (z_keys ));
500- zval z_args [ argc ] ;
500+ z_args = emalloc ( argc * sizeof ( zval * )) ;
501501
502502 /* prepare first parameters */
503503 ZVAL_STRING (& z_fun , cmd );
504- ZVAL_STRING (& z_args [0 ], PHPREDIS_INDEX_NAME );
504+ ZVAL_STRING (z_args [0 ], PHPREDIS_INDEX_NAME );
505505
506506 /* prepare keys */
507507 for (i = 0 ; i < argc - 1 ; ++ i ) {
508508 zval * zp ;
509509 zp = zend_hash_index_find (Z_ARRVAL_P (z_keys ), i );
510- ZVAL_DUP (& z_args [i + 1 ], zp );
510+ ZVAL_DUP (z_args [i + 1 ], zp );
511511 }
512512
513513 /* run cmd */
514- call_user_function (& redis_ce -> function_table , z_redis , & z_fun , & z_ret , argc , z_args TSRMLS_CC );
514+ call_user_function (& redis_ce -> function_table , z_redis , & z_fun , & z_ret , argc , * z_args TSRMLS_CC );
515515
516516 /* don't dtor z_ret, since we're returning z_redis */
517517}
@@ -809,7 +809,7 @@ ra_expire_key(const char *key, int key_len, zval *z_to, long ttl TSRMLS_DC) {
809809static zend_bool
810810ra_move_zset (const char * key , int key_len , zval * z_from , zval * z_to , long ttl TSRMLS_DC ) {
811811
812- zval z_fun_zrange , z_fun_zadd , z_ret , z_ret_dest , z_args [4 ], * z_score_p ;
812+ zval z_fun_zrange , z_fun_zadd , z_ret , z_ret_dest , z_args [4 ], * z_score_p , * * z_zadd_args ;
813813 int count ;
814814 HashTable * h_zset_vals ;
815815 zend_string * val ;
@@ -839,7 +839,7 @@ ra_move_zset(const char *key, int key_len, zval *z_from, zval *z_to, long ttl TS
839839
840840 /* allocate argument array for ZADD */
841841 count = zend_hash_num_elements (h_zset_vals );
842- zval z_zadd_args [ ( 1 + 2 * count ) ] ;
842+ z_zadd_args = emalloc (( 1 + 2 * count ) * sizeof ( zval * )) ;
843843
844844 for (i = 1 , zend_hash_internal_pointer_reset (h_zset_vals );
845845 zend_hash_has_more_elements (h_zset_vals ) == SUCCESS ;
@@ -851,15 +851,15 @@ ra_move_zset(const char *key, int key_len, zval *z_from, zval *z_to, long ttl TS
851851
852852 /* add score */
853853 convert_to_double (z_score_p );
854- ZVAL_DOUBLE (& z_zadd_args [i ], Z_DVAL_P (z_score_p ));
854+ ZVAL_DOUBLE (z_zadd_args [i ], Z_DVAL_P (z_score_p ));
855855
856856 /* add value */
857857 switch (zend_hash_get_current_key_ex (h_zset_vals , & val , & idx , 0 )) {
858858 case HASH_KEY_IS_STRING :
859- ZVAL_STRINGL (& z_zadd_args [i + 1 ], val -> val , val -> len - 1 ); /* we have to remove 1 because it is an array key. */
859+ ZVAL_STRINGL (z_zadd_args [i + 1 ], val -> val , val -> len - 1 ); /* we have to remove 1 because it is an array key. */
860860 break ;
861861 case HASH_KEY_IS_LONG :
862- ZVAL_LONG (& z_zadd_args [i + 1 ], (long )idx );
862+ ZVAL_LONG (z_zadd_args [i + 1 ], (long )idx );
863863 break ;
864864 default :
865865 return -1 ; /* Todo: log error */
@@ -870,15 +870,16 @@ ra_move_zset(const char *key, int key_len, zval *z_from, zval *z_to, long ttl TS
870870
871871 /* run ZADD on target */
872872 ZVAL_STRINGL (& z_fun_zadd , "ZADD" , 4 );
873- ZVAL_STRINGL (& z_zadd_args [0 ], key , key_len );
874- call_user_function (& redis_ce -> function_table , z_to , & z_fun_zadd , & z_ret_dest , 1 + 2 * count , z_zadd_args TSRMLS_CC );
873+ ZVAL_STRINGL (z_zadd_args [0 ], key , key_len );
874+ call_user_function (& redis_ce -> function_table , z_to , & z_fun_zadd , & z_ret_dest , 1 + 2 * count , * z_zadd_args TSRMLS_CC );
875875
876876 /* Expire if needed */
877877 ra_expire_key (key , key_len , z_to , ttl TSRMLS_CC );
878878
879879 /* cleanup */
880880 for (i = 0 ; i < 1 + 2 * count ; ++ i ) {
881- zval_dtor (& z_zadd_args [i ]);
881+ zval_dtor (z_zadd_args [i ]);
882+ efree (& z_zadd_args [i ]);
882883 }
883884
884885 zval_dtor (& z_ret );
@@ -962,23 +963,23 @@ ra_move_collection(const char *key, int key_len, zval *z_from, zval *z_to,
962963 int list_count , const char * * cmd_list ,
963964 int add_count , const char * * cmd_add , long ttl TSRMLS_DC ) {
964965
965- zval z_fun_retrieve , z_fun_sadd , z_ret , * z_data_p ;
966+ zval z_fun_retrieve , z_fun_sadd , z_ret , * z_data_p , * * z_retrieve_args , * * z_sadd_args ;
966967 int count , i ;
967968 HashTable * h_set_vals ;
968969
969970 /* run retrieval command on source */
970- zval z_retrieve_args [ 1 + list_count ] ;
971+ z_retrieve_args = emalloc (( 1 + list_count ) * sizeof ( zval * )) ;
971972 ZVAL_STRING (& z_fun_retrieve , cmd_list [0 ]); /* set the command */
972973
973974 /* set the key */
974- ZVAL_STRINGL (& z_retrieve_args [0 ], key , key_len );
975+ ZVAL_STRINGL (z_retrieve_args [0 ], key , key_len );
975976
976977 /* possibly add some other args if they were provided. */
977978 for (i = 1 ; i < list_count ; ++ i ) {
978- ZVAL_STRING (& z_retrieve_args [i ], cmd_list [i ]);
979+ ZVAL_STRING (z_retrieve_args [i ], cmd_list [i ]);
979980 }
980981
981- call_user_function (& redis_ce -> function_table , z_from , & z_fun_retrieve , & z_ret , list_count , z_retrieve_args TSRMLS_CC );
982+ call_user_function (& redis_ce -> function_table , z_from , & z_fun_retrieve , & z_ret , list_count , * z_retrieve_args TSRMLS_CC );
982983
983984 if (Z_TYPE (z_ret ) != IS_ARRAY ) { /* key not found or replaced */
984985 /* TODO: report? */
@@ -988,9 +989,9 @@ ra_move_collection(const char *key, int key_len, zval *z_from, zval *z_to,
988989 /* run SADD/RPUSH on target */
989990 h_set_vals = Z_ARRVAL (z_ret );
990991 count = zend_hash_num_elements (h_set_vals );
991- zval z_sadd_args [ 1 + count ] ;
992+ z_sadd_args = emalloc (( 1 + count ) * sizeof ( zval * )) ;
992993 ZVAL_STRING (& z_fun_sadd , cmd_add [0 ]);
993- ZVAL_STRINGL (& z_sadd_args [0 ], key , key_len );
994+ ZVAL_STRINGL (z_sadd_args [0 ], key , key_len );
994995
995996 for (i = 0 , zend_hash_internal_pointer_reset (h_set_vals );
996997 zend_hash_has_more_elements (h_set_vals ) == SUCCESS ;
@@ -1001,21 +1002,21 @@ ra_move_collection(const char *key, int key_len, zval *z_from, zval *z_to,
10011002 }
10021003
10031004 /* add set elements */
1004- ZVAL_DUP (& z_sadd_args [i + 1 ], z_data_p );
1005+ ZVAL_DUP (z_sadd_args [i + 1 ], z_data_p );
10051006 }
10061007
10071008 /* Clean up our input return value */
10081009 zval_dtor (& z_ret );
10091010
1010- call_user_function (& redis_ce -> function_table , z_to , & z_fun_sadd , & z_ret , count + 1 , z_sadd_args TSRMLS_CC );
1011+ call_user_function (& redis_ce -> function_table , z_to , & z_fun_sadd , & z_ret , count + 1 , * z_sadd_args TSRMLS_CC );
10111012
10121013 /* Expire if needed */
10131014 ra_expire_key (key , key_len , z_to , ttl TSRMLS_CC );
10141015
10151016 /* cleanup */
10161017
10171018 for (i = 0 ; i < count ; ++ i ) {
1018- zval_dtor (& z_sadd_args [i + 1 ]);
1019+ zval_dtor (z_sadd_args [i + 1 ]);
10191020 }
10201021 efree (z_sadd_args );
10211022
0 commit comments