From 45b0f6fb14f2a0d5bca0b4e32cb44a31e29aa921 Mon Sep 17 00:00:00 2001
From: Pieter Noordhuis <pcnoordhuis@gmail.com>
Date: Fri, 22 Apr 2011 09:44:06 +0200
Subject: [PATCH] Use correct argc/argv for cleanup when loading AOF

---
 src/aof.c                 |  8 +++++---
 tests/integration/aof.tcl | 18 ++++++++++++++++++
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/aof.c b/src/aof.c
index 5d75c374..e5327cb2 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 c7ba93c1..927969b6 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]
+        }
+    }
 }