From b5cc22d191e33d0af9394ae1a124fe315f6a69e2 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 27 Aug 2013 11:56:47 +0200 Subject: [PATCH] tryObjectEncoding(): don't call stringl2() for too big strings. We are sure that a string that is longer than 21 chars cannot be represented by a 64 bit signed integer, as -(2^64) is 21 chars: strlen(-18446744073709551616) => 21 --- src/object.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/object.c b/src/object.c index 00cf023b..0f2eeba7 100644 --- a/src/object.c +++ b/src/object.c @@ -273,6 +273,7 @@ int isObjectRepresentableAsLongLong(robj *o, long long *llval) { robj *tryObjectEncoding(robj *o) { long value; sds s = o->ptr; + size_t len; if (o->encoding != REDIS_ENCODING_RAW) return o; /* Already encoded */ @@ -286,7 +287,8 @@ robj *tryObjectEncoding(robj *o) { redisAssertWithInfo(NULL,o,o->type == REDIS_STRING); /* Check if we can represent this string as a long integer */ - if (!string2l(s,sdslen(s),&value)) return o; + len = sdslen(s); + if (len > 21 || !string2l(s,len,&value)) return o; /* Ok, this object can be encoded... *