From 6531c94d28c8314c934847d421a79ddb31298aeb Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 26 May 2010 16:47:37 +0200 Subject: [PATCH] raise error on nested MULTI and WATCH inside multi --- redis.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/redis.c b/redis.c index f18eabe6..da5baa2e 100644 --- a/redis.c +++ b/redis.c @@ -2446,7 +2446,10 @@ static int processCommand(redisClient *c) { } /* Exec the command */ - if (c->flags & REDIS_MULTI && cmd->proc != execCommand && cmd->proc != discardCommand) { + if (c->flags & REDIS_MULTI && + cmd->proc != execCommand && cmd->proc != discardCommand && + cmd->proc != multiCommand && cmd->proc != watchCommand) + { queueMultiCommand(c,cmd); addReply(c,shared.queued); } else { @@ -7498,6 +7501,10 @@ static void queueMultiCommand(redisClient *c, struct redisCommand *cmd) { } static void multiCommand(redisClient *c) { + if (c->flags & REDIS_MULTI) { + addReplySds(c,sdsnew("-ERR MULTI calls can not be nested\r\n")); + return; + } c->flags |= REDIS_MULTI; addReply(c,shared.ok); } @@ -10513,6 +10520,10 @@ static void touchWatchedKeysOnFlush(int dbid) { static void watchCommand(redisClient *c) { int j; + if (c->flags & REDIS_MULTI) { + addReplySds(c,sdsnew("-ERR WATCH inside MULTI is not allowed\r\n")); + return; + } for (j = 1; j < c->argc; j++) watchForKey(c,c->argv[j]); addReply(c,shared.ok); -- 2.47.2