diff --git a/hiredis.c b/hiredis.c index 0b0db5227..3aa31645a 100644 --- a/hiredis.c +++ b/hiredis.c @@ -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; diff --git a/test.c b/test.c index 6a56f3254..9022f7341 100644 --- a/test.c +++ b/test.c @@ -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) {