summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Noordhuis <pcnoordhuis@gmail.com>2011-04-22 09:39:18 +0200
committerPieter Noordhuis <pcnoordhuis@gmail.com>2011-04-22 09:41:07 +0200
commitbf3692797df817c3abfd430a017f55ce9c9ecf87 (patch)
treeb5785d245779021706290a9c49f53f1ce7014621
parentda06854477b5bb2462576d529fa0570925bd421d (diff)
downloadredis-bf3692797df817c3abfd430a017f55ce9c9ecf87.tar.gz
Use correct argc/argv for cleanup when loading AOF
-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 93c857758..24ddec352 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -285,9 +285,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);
/* Handle swapping while loading big datasets when VM is on */
force_swapout = 0;
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]
+ }
+ }
}