diff --git a/hiredis.c b/hiredis.c index 5888dd3..490b7ea 100644 --- a/hiredis.c +++ b/hiredis.c @@ -294,6 +294,13 @@ static int processMultiBulkItem(redisReader *r) { long elements; int root = 0; + /* Set error for nested multi bulks with depth > 1 */ + if (r->ridx == 2) { + redisSetReplyReaderError(r,sdscatprintf(sdsempty(), + "No support for nested multi bulk replies with depth > 1")); + return -1; + } + if ((p = readLine(r,NULL)) != NULL) { elements = strtol(p,NULL,10); root = (r->ridx == 0); diff --git a/test.c b/test.c index beccd60..a6527f6 100644 --- a/test.c +++ b/test.c @@ -256,6 +256,17 @@ static void test_reply_reader() { strcasecmp(err,"Protocol error, got \"@\" as reply type byte") == 0); redisReplyReaderFree(reader); + test("Set error on nested multi bulks with depth > 1: "); + reader = redisReplyReaderCreate(); + redisReplyReaderFeed(reader,(char*)"*1\r\n",4); + redisReplyReaderFeed(reader,(char*)"*1\r\n",4); + redisReplyReaderFeed(reader,(char*)"*1\r\n",4); + ret = redisReplyReaderGetReply(reader,NULL); + err = redisReplyReaderGetError(reader); + test_cond(ret == REDIS_ERR && + strncasecmp(err,"No support for",14) == 0); + redisReplyReaderFree(reader); + test("Works with NULL functions for reply: "); reader = redisReplyReaderCreate(); redisReplyReaderSetReplyObjectFunctions(reader,NULL);