From bf3692797df817c3abfd430a017f55ce9c9ecf87 Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Fri, 22 Apr 2011 09:39:18 +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 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] + } + } } -- GitLab