diff --git a/src/object.c b/src/object.c index 45dde52b3..b16123eba 100644 --- a/src/object.c +++ b/src/object.c @@ -375,6 +375,7 @@ int getLongLongFromObject(robj *o, long long *target) { redisAssert(o->type == REDIS_STRING); if (o->encoding == REDIS_ENCODING_RAW) { value = strtoll(o->ptr, &eptr, 10); + if (errno == ERANGE) return REDIS_ERR; if (eptr[0] != '\0') return REDIS_ERR; } else if (o->encoding == REDIS_ENCODING_INT) { value = (long)o->ptr; diff --git a/tests/unit/type/set.tcl b/tests/unit/type/set.tcl index a1b655ef8..056ed27c8 100644 --- a/tests/unit/type/set.tcl +++ b/tests/unit/type/set.tcl @@ -45,6 +45,12 @@ start_server { assert_encoding hashtable myset } + test "SADD an integer larger than 64 bits" { + create_set myset {213244124402402314402033402} + assert_encoding hashtable myset + assert_equal 1 [r sismember myset 213244124402402314402033402] + } + test "SADD overflows the maximum allowed integers in an intset" { r del myset for {set i 0} {$i < 512} {incr i} { r sadd myset $i }