diff options
author | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-06-09 09:23:54 +0200 |
---|---|---|
committer | Pieter Noordhuis <pcnoordhuis@gmail.com> | 2011-06-09 09:25:09 +0200 |
commit | 5f5b3d9787198bca6724b576ed778acd89c072db (patch) | |
tree | 8b2b3f43ab77706dedef48146f89ce3e1086b543 | |
parent | 159a83ab8a6699c9a4c073a943a774baf1116f97 (diff) | |
download | hiredict-5f5b3d9787198bca6724b576ed778acd89c072db.tar.xz |
Fix for issue #45
-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) { |