]> git.saurik.com Git - redis.git/commitdiff
Use correct argc/argv for cleanup when loading AOF
authorPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 22 Apr 2011 07:44:06 +0000 (09:44 +0200)
committerPieter Noordhuis <pcnoordhuis@gmail.com>
Fri, 22 Apr 2011 07:44:06 +0000 (09:44 +0200)
src/aof.c
tests/integration/aof.tcl

index 5d75c3745807007651082073072d0e0f0ad73557..e5327cb2d0a46af451d96ddc3bd66e5c6f01b887 100644 (file)
--- 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);
 
         /* 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.
     }
 
     /* This point can only be reached when EOF is reached without errors.
index c7ba93c197947d1f4136b4c5fb8c4cdc9a73eed5..927969b627525f5f774b6226f92949df1cbb00a3 100644 (file)
@@ -83,4 +83,22 @@ tags {"aof"} {
             assert_equal "" [$client get bar]
         }
     }
             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]
+        }
+    }
 }
 }