From a73b957f1a4191ba9d438c5e1f970d16997dfdb7 Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Mon, 4 Aug 2014 22:39:48 +0000 Subject: [PATCH] support nil array --- values.go | 13 ++++++++++++- values_test.go | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/values.go b/values.go index c0c589b..6c155cb 100644 --- a/values.go +++ b/values.go @@ -101,9 +101,13 @@ func readBulkString(prefix []byte, r io.Reader) (value, error) { return nil, fmt.Errorf("unable to read bulkstring in redis protocol: bad prefix: %v", err) } - if n == -1 { + switch { + case n == -1: return nil, nil + case n < 0: + return nil, fmt.Errorf("redis protocol error: illegal bulk string of negative length %d", n) } + n += 2 b := make([]byte, n) n_read, err := r.Read(b) @@ -135,6 +139,13 @@ func readArray(prefix []byte, r *bufio.Reader) (value, error) { return nil, fmt.Errorf("unable to read array in redis protocol: bad prefix: %v", err) } + switch { + case n == -1: + return nil, nil + case n < 0: + return nil, fmt.Errorf("redis protocol error: illegal array of negative length %d", n) + } + a := make(Array, n) for i := int64(0); i < n; i++ { v, err := readValue(r) diff --git a/values_test.go b/values_test.go index c18cbfe..0c6c3f1 100644 --- a/values_test.go +++ b/values_test.go @@ -79,6 +79,7 @@ var valueTests = []valueTest{ {":9223372036854775807\r\n+extra\r\n", Integer(9223372036854775807)}, // int64 max {":-9223372036854775808\r\n+extra\r\n", Integer(-9223372036854775808)}, // int64 min + {"*-1\r\n", nil}, // nil array {"*0\r\n", Array{}}, // is this a thing? I have no idea. {"*1\r\n+hello\r\n", Array{String("hello")}}, {"*2\r\n+one\r\n+two", Array{String("one"), String("two")}},