1
0
mirror of https://github.com/fluencelabs/redis synced 2025-03-31 14:51:04 +00:00

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
This commit is contained in:
antirez 2013-08-27 11:56:47 +02:00
parent ff9d66c4a9
commit 6672bc8b3b

@ -339,6 +339,7 @@ int isObjectRepresentableAsLongLong(robj *o, long long *llval) {
robj *tryObjectEncoding(robj *o) { robj *tryObjectEncoding(robj *o) {
long value; long value;
sds s = o->ptr; sds s = o->ptr;
size_t len;
if (o->encoding == REDIS_ENCODING_INT) if (o->encoding == REDIS_ENCODING_INT)
return o; /* Already encoded */ return o; /* Already encoded */
@ -351,8 +352,11 @@ robj *tryObjectEncoding(robj *o) {
/* Currently we try to encode only strings */ /* Currently we try to encode only strings */
redisAssertWithInfo(NULL,o,o->type == REDIS_STRING); redisAssertWithInfo(NULL,o,o->type == REDIS_STRING);
/* Check if we can represent this string as a long integer */ /* Check if we can represent this string as a long integer.
if (!string2l(s,sdslen(s),&value)) { * Note that we are sure that a string larger than 21 chars is not
* representable as a 64 bit integer. */
len = sdslen(s);
if (len > 21 || !string2l(s,len,&value)) {
/* Integer encoding not possible. Check if we can use EMBSTR. */ /* Integer encoding not possible. Check if we can use EMBSTR. */
if (sdslen(s) <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT) { if (sdslen(s) <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT) {
robj *emb = createEmbeddedStringObject(s,sdslen(s)); robj *emb = createEmbeddedStringObject(s,sdslen(s));