summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/aof.c8
-rw-r--r--tests/integration/aof.tcl18
2 files changed, 23 insertions, 3 deletions
diff --git a/src/aof.c b/src/aof.c
index 5d75c3745..e5327cb2d 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -284,9 +284,11 @@ int loadAppendOnlyFile(char *filename) {
/* The fake client should not have a reply */
redisAssert(fakeClient->bufpos == 0 && listLength(fakeClient->reply) == 0);
- /* Clean up, ready for the next command */
- for (j = 0; j < argc; j++) decrRefCount(argv[j]);
- zfree(argv);
+ /* Clean up. Command code may have changed argv/argc so we use the
+ * argv/argc of the client instead of the local variables. */
+ for (j = 0; j < fakeClient->argc; j++)
+ decrRefCount(fakeClient->argv[j]);
+ zfree(fakeClient->argv);
}
/* This point can only be reached when EOF is reached without errors.
diff --git a/tests/integration/aof.tcl b/tests/integration/aof.tcl
index c7ba93c19..927969b62 100644
--- a/tests/integration/aof.tcl
+++ b/tests/integration/aof.tcl
@@ -83,4 +83,22 @@ tags {"aof"} {
assert_equal "" [$client get bar]
}
}
+
+ ## Test that SPOP (that modifies the client its argc/argv) is correctly free'd
+ create_aof {
+ append_to_aof [formatCommand sadd set foo]
+ append_to_aof [formatCommand sadd set bar]
+ append_to_aof [formatCommand spop set]
+ }
+
+ start_server_aof [list dir $server_path] {
+ test "AOF+SPOP: Server should have been started" {
+ assert_equal 1 [is_alive $srv]
+ }
+
+ test "AOF+SPOP: Set should have 1 member" {
+ set client [redis [dict get $srv host] [dict get $srv port]]
+ assert_equal 1 [$client scard set]
+ }
+ }
}