From 352172a7ef5015c0c487ba6258cdf3b4b31a551c Mon Sep 17 00:00:00 2001 From: Mihir Joshi Date: Sun, 14 Dec 2014 10:12:58 -0500 Subject: [PATCH] Stricter options for SET command - As per Antirez's suggestion, this commit raises an error when mutually exclusive options are provided. Duplicate options are allowed. --- src/t_string.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/t_string.c b/src/t_string.c index 0bbefcaa..067aa10e 100644 --- a/src/t_string.c +++ b/src/t_string.c @@ -103,20 +103,24 @@ void setCommand(redisClient *c) { char *a = c->argv[j]->ptr; robj *next = (j == c->argc-1) ? NULL : c->argv[j+1]; - if (!(flags & REDIS_SET_NX) && (a[0] == 'n' || a[0] == 'N') && - (a[1] == 'x' || a[1] == 'X') && a[2] == '\0') { + if ((a[0] == 'n' || a[0] == 'N') && + (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && + !(flags & REDIS_SET_XX)) { flags |= REDIS_SET_NX; - } else if (!(flags & REDIS_SET_XX) && (a[0] == 'x' || a[0] == 'X') && - (a[1] == 'x' || a[1] == 'X') && a[2] == '\0') { + } else if ((a[0] == 'x' || a[0] == 'X') && + (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && + !(flags & REDIS_SET_NX)) { flags |= REDIS_SET_XX; - } else if (!(flags & REDIS_SET_EX) && (a[0] == 'e' || a[0] == 'E') && - (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && next) { + } else if ((a[0] == 'e' || a[0] == 'E') && + (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && + !(flags & REDIS_SET_PX) && next) { flags |= REDIS_SET_EX; unit = UNIT_SECONDS; expire = next; j++; - } else if (!(flags & REDIS_SET_PX) && (a[0] == 'p' || a[0] == 'P') && - (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && next) { + } else if ((a[0] == 'p' || a[0] == 'P') && + (a[1] == 'x' || a[1] == 'X') && a[2] == '\0' && + !(flags & REDIS_SET_EX) && next) { flags |= REDIS_SET_PX; unit = UNIT_MILLISECONDS; expire = next;