Skip to content

Commit 70bbe04

Browse files
Memory corruption/leak fixes for mget/mset
1 parent 9741413 commit 70bbe04

File tree

1 file changed

+18
-18
lines changed

1 file changed

+18
-18
lines changed

redis_array.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -927,7 +927,6 @@ PHP_METHOD(RedisArray, mget)
927927
argv[i++] = data;
928928
} ZEND_HASH_FOREACH_END();
929929

930-
MAKE_STD_ZVAL(z_argarray);
931930
MAKE_STD_ZVAL(z_tmp_array);
932931
array_init(z_tmp_array);
933932

@@ -937,6 +936,7 @@ PHP_METHOD(RedisArray, mget)
937936
if(!argc_each[n]) continue;
938937

939938
/* copy args for MGET call on node. */
939+
MAKE_STD_ZVAL(z_argarray);
940940
array_init(z_argarray);
941941

942942
for(i = 0; i < argc; ++i) {
@@ -997,7 +997,6 @@ PHP_METHOD(RedisArray, mget)
997997
}
998998

999999
/* cleanup */
1000-
PHPREDIS_FREE_ZVAL(z_argarray);
10011000
PHPREDIS_FREE_ZVAL(z_tmp_array);
10021001
efree(argv);
10031002
efree(pos);
@@ -1008,7 +1007,7 @@ PHP_METHOD(RedisArray, mget)
10081007
/* MSET will distribute the call to several nodes and regroup the values. */
10091008
PHP_METHOD(RedisArray, mset)
10101009
{
1011-
zval *object, *z_keys, z_argarray, *data, z_ret, **argv;
1010+
zval *object, *z_keys, *z_argarray, *data, *z_ret, **argv, *z_tmp;
10121011
int i = 0, n;
10131012
RedisArray *ra;
10141013
int *pos, argc, *argc_each;
@@ -1072,45 +1071,46 @@ PHP_METHOD(RedisArray, mset)
10721071

10731072
int found = 0;
10741073

1074+
/* Array for calling MSET */
1075+
MAKE_STD_ZVAL(z_argarray);
1076+
array_init(z_argarray);
1077+
10751078
/* copy args */
1076-
array_init(&z_argarray);
10771079
for(i = 0; i < argc; ++i) {
10781080
if(pos[i] != n) continue;
10791081

1080-
zval zv, *z_tmp = &zv;
1081-
#if (PHP_MAJOR_VERSION < 7)
10821082
MAKE_STD_ZVAL(z_tmp);
1083-
#endif
10841083
ZVAL_ZVAL(z_tmp, argv[i], 1, 0);
1085-
add_assoc_zval_ex(&z_argarray, keys[i], key_lens[i], z_tmp);
1084+
add_assoc_zval_ex(z_argarray, keys[i], key_lens[i], z_tmp);
10861085
found++;
10871086
}
10881087

10891088
if(!found) {
1090-
zval_dtor(&z_argarray);
1089+
PHPREDIS_FREE_ZVAL(z_argarray);
10911090
continue; /* don't run empty MSETs */
10921091
}
10931092

10941093
if(ra->index) { /* add MULTI */
10951094
ra_index_multi(&ra->redis[n], MULTI TSRMLS_CC);
10961095
}
10971096

1098-
zval z_fun;
1099-
1100-
/* prepare call */
1101-
ZVAL_STRINGL(&z_fun, "MSET", 4);
1097+
/* Prepare MSET call */
1098+
zval z_mset;
1099+
ZVAL_STRINGL(&z_mset, "MSET", 4);
11021100

11031101
/* call */
1104-
call_user_function(&redis_ce->function_table, &ra->redis[n], &z_fun, &z_ret, 1, &z_argarray);
1105-
zval_dtor(&z_fun);
1106-
zval_dtor(&z_ret);
1102+
MAKE_STD_ZVAL(z_ret);
1103+
call_user_function(&redis_ce->function_table, &ra->redis[n], &z_mset, z_ret, 1, z_argarray);
1104+
zval_dtor(&z_mset);
1105+
PHPREDIS_FREE_ZVAL(z_ret);
11071106

11081107
if(ra->index) {
1109-
ra_index_keys(&z_argarray, &ra->redis[n] TSRMLS_CC); /* use SADD to add keys to node index */
1108+
ra_index_keys(z_argarray, &ra->redis[n] TSRMLS_CC); /* use SADD to add keys to node index */
11101109
ra_index_exec(&ra->redis[n], NULL, 0 TSRMLS_CC); /* run EXEC */
11111110
}
11121111

1113-
zval_dtor(&z_argarray);
1112+
/* Free up our MSET args */
1113+
PHPREDIS_FREE_ZVAL(z_argarray);
11141114
}
11151115

11161116
/* Free any keys that we needed to allocate memory for, because they weren't strings */

0 commit comments

Comments
 (0)