diff options
author | yoav-steinberg <yoav@monfort.co.il> | 2021-10-05 12:17:36 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-05 12:17:36 +0300 |
commit | 83478e6102bd86d077e64bb40b0903f8a06905b1 (patch) | |
tree | ba0dba6e4c2db5137e84a3e132da71d3eb468503 /src/multi.c | |
parent | 0f8b634cd5cdfd77696d34d744dfc25fa97f3b73 (diff) | |
download | redis-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.c | 6 |
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); |