diff options
-rw-r--r-- | hiredis.c | 12 | ||||
-rw-r--r-- | test.c | 12 |
2 files changed, 19 insertions, 5 deletions
@@ -77,7 +77,7 @@ void freeReplyObject(void *reply) { case REDIS_REPLY_INTEGER: break; /* Nothing to free */ case REDIS_REPLY_ARRAY: - if (r->elements > 0 && r->element != NULL) { + if (r->element != NULL) { for (j = 0; j < r->elements; j++) if (r->element[j] != NULL) freeReplyObject(r->element[j]); @@ -133,10 +133,12 @@ static void *createArrayObject(const redisReadTask *task, int elements) { if (r == NULL) return NULL; - r->element = calloc(elements,sizeof(redisReply*)); - if (r->element == NULL) { - freeReplyObject(r); - return NULL; + if (elements > 0) { + r->element = calloc(elements,sizeof(redisReply*)); + if (r->element == NULL) { + freeReplyObject(r); + return NULL; + } } r->elements = elements; @@ -247,6 +247,18 @@ static void test_reply_reader(void) { assert(ret == REDIS_ERR); ret = redisReaderGetReply(reader,&reply); test_cond(ret == REDIS_ERR && reply == NULL); + redisReaderFree(reader); + + /* Regression test for issue #45 on GitHub. */ + test("Don't do empty allocation for empty multi bulk: "); + reader = redisReaderCreate(); + redisReaderFeed(reader,(char*)"*0\r\n",4); + ret = redisReaderGetReply(reader,&reply); + test_cond(ret == REDIS_OK && + ((redisReply*)reply)->type == REDIS_REPLY_ARRAY && + ((redisReply*)reply)->elements == 0); + freeReplyObject(reply); + redisReaderFree(reader); } static void *test_create_string(const redisReadTask *task, char *str, size_t len) { |