From f483ce5ffef0beb6e5ab50987691d00166e8216b Mon Sep 17 00:00:00 2001 From: Pieter Noordhuis Date: Thu, 24 Jun 2010 15:12:42 -0700 Subject: [PATCH] fix unexpected behavior on an out of range end index for LRANGE and LTRIM --- redis.c | 8 ++++---- tests/unit/type/list.tcl | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/redis.c b/redis.c index 6ac410d0..085d3553 100644 --- a/redis.c +++ b/redis.c @@ -5404,9 +5404,9 @@ static void lrangeCommand(redisClient *c) { if (start < 0) start = llen+start; if (end < 0) end = llen+end; if (start < 0) start = 0; - if (end < 0) end = 0; - /* indexes sanity checks */ + /* Invariant: start >= 0, so this test will be true when end < 0. + * The range is empty when start > end or start >= length. */ if (start > end || start >= llen) { /* Out of range start or start > end result in empty list */ addReply(c,shared.emptymultibulk); @@ -5444,9 +5444,9 @@ static void ltrimCommand(redisClient *c) { if (start < 0) start = llen+start; if (end < 0) end = llen+end; if (start < 0) start = 0; - if (end < 0) end = 0; - /* indexes sanity checks */ + /* Invariant: start >= 0, so this test will be true when end < 0. + * The range is empty when start > end or start >= length. */ if (start > end || start >= llen) { /* Out of range start or start > end result in empty list */ ltrim = llen; diff --git a/tests/unit/type/list.tcl b/tests/unit/type/list.tcl index ecae5d22..8a7ea278 100644 --- a/tests/unit/type/list.tcl +++ b/tests/unit/type/list.tcl @@ -340,6 +340,12 @@ start_server { create_$type mylist {1 2 3} assert_equal {1 2 3} [r lrange mylist -1000 1000] } + + test "LRANGE out of range negative end index - $type" { + create_$type mylist {1 2 3} + assert_equal {1} [r lrange mylist 0 -3] + assert_equal {} [r lrange mylist 0 -4] + } } test {LRANGE against non existing key} { @@ -369,6 +375,11 @@ start_server { assert_equal {1 2 3 4 5} [trim_list $type 0 10] } + test "LTRIM out of range negative end index - $type" { + assert_equal {1} [trim_list $type 0 -5] + assert_equal {} [trim_list $type 0 -6] + } + tags {"slow"} { test "LTRIM stress testing - $type" { set mylist {}