summaryrefslogtreecommitdiff
path: root/src/multi.c
diff options
context:
space:
mode:
authoryoav-steinberg <yoav@monfort.co.il>2021-10-05 12:17:36 +0300
committerGitHub <noreply@github.com>2021-10-05 12:17:36 +0300
commit83478e6102bd86d077e64bb40b0903f8a06905b1 (patch)
treeba0dba6e4c2db5137e84a3e132da71d3eb468503 /src/multi.c
parent0f8b634cd5cdfd77696d34d744dfc25fa97f3b73 (diff)
downloadredis-83478e6102bd86d077e64bb40b0903f8a06905b1.tar.gz
argv mem leak during multi command execution. (#9598)
Changes in #9528 lead to memory leak if the command implementation used rewriteClientCommandArgument inside MULTI-EXEC. Adding an explicit test for that case since the test that uncovered it didn't specifically target this scenario
Diffstat (limited to 'src/multi.c')
-rw-r--r--src/multi.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/multi.c b/src/multi.c
index b02457bb9..4171131b7 100644
--- a/src/multi.c
+++ b/src/multi.c
@@ -159,7 +159,7 @@ void execCommandAbort(client *c, sds error) {
void execCommand(client *c) {
int j;
robj **orig_argv;
- int orig_argc;
+ int orig_argc, orig_argv_len;
struct redisCommand *orig_cmd;
int was_master = server.masterhost == NULL;
@@ -201,11 +201,12 @@ void execCommand(client *c) {
server.in_exec = 1;
orig_argv = c->argv;
+ orig_argv_len = c->argv_len;
orig_argc = c->argc;
orig_cmd = c->cmd;
addReplyArrayLen(c,c->mstate.count);
for (j = 0; j < c->mstate.count; j++) {
- c->argc = c->mstate.commands[j].argc;
+ c->argv_len = c->argc = c->mstate.commands[j].argc;
c->argv = c->mstate.commands[j].argv;
c->cmd = c->mstate.commands[j].cmd;
@@ -252,6 +253,7 @@ void execCommand(client *c) {
c->flags &= ~CLIENT_DENY_BLOCKING;
c->argv = orig_argv;
+ c->argv_len = orig_argv_len;
c->argc = orig_argc;
c->cmd = orig_cmd;
discardTransaction(c);