diff options
author | Jan-Erik Rediger <badboy@archlinux.us> | 2014-06-29 12:32:06 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2014-08-07 12:40:44 +0200 |
commit | 53fdfda9e3316a5763c78569fa74bf42e1c4b3a7 (patch) | |
tree | 19183148f7c52a53db9730d680e4584c2f2a2687 | |
parent | f17f8521f005321d3e163ed83ec2fa9f1b925b0f (diff) | |
download | redis-53fdfda9e3316a5763c78569fa74bf42e1c4b3a7.tar.gz |
Handle large getrange requests
Previously the end was casted to a smaller type
which resulted in a wrong check and failed
with values larger than handled by unsigned.
Closes #1847, #1844
-rw-r--r-- | src/t_string.c | 2 | ||||
-rw-r--r-- | tests/unit/basic.tcl | 5 |
2 files changed, 6 insertions, 1 deletions
diff --git a/src/t_string.c b/src/t_string.c index 41e4b3b71..397363c5c 100644 --- a/src/t_string.c +++ b/src/t_string.c @@ -255,7 +255,7 @@ void getrangeCommand(redisClient *c) { if (end < 0) end = strlen+end; if (start < 0) start = 0; if (end < 0) end = 0; - if ((unsigned)end >= strlen) end = strlen-1; + if ((size_t)end >= strlen) end = strlen-1; /* Precondition: end >= 0 && end < strlen, so the only condition where * nothing can be returned is: start > end. */ diff --git a/tests/unit/basic.tcl b/tests/unit/basic.tcl index 6f7fe292c..2579cc9dc 100644 --- a/tests/unit/basic.tcl +++ b/tests/unit/basic.tcl @@ -769,4 +769,9 @@ start_server {tags {"basic"}} { r keys * r keys * } {dlskeriewrioeuwqoirueioqwrueoqwrueqw} + + test {GETRANGE with huge ranges, Github issue #1844} { + r set foo bar + r getrange foo 0 4294967297 + } {bar} } |