From 79a1d335c85be3b66a89962f71e830df7eea8c35 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 5202c0c5..1c9c37e8 100644 --- a/src/object.c +++ b/src/object.c @@ -278,6 +278,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 */ @@ -291,7 +292,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... *