From 99cd9af7d5ec011d235f48996e8c7dfebc4e9910 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Mon, 6 Feb 2017 18:38:54 +0100 Subject: [PATCH] parse_array: goto fail error handling Makes the control flow easier to reason about and fixes a few potential memory leaks. --- cJSON.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/cJSON.c b/cJSON.c index fc9fe07..45301ab 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1127,7 +1127,7 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value, { /* not an array! */ *ep = value; - return NULL; + goto fail; } item->type = cJSON_Array; @@ -1142,13 +1142,13 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value, if (!item->child) { /* memory fail */ - return NULL; + goto fail; } /* skip any spacing, get the value. */ value = skip(parse_value(child, skip(value), ep)); if (!value) { - return NULL; + goto fail; } /* loop through the comma separated array elements */ @@ -1158,7 +1158,7 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value, if (!(new_item = cJSON_New_Item())) { /* memory fail */ - return NULL; + goto fail; } /* add new item to end of the linked list */ child->next = new_item; @@ -1170,7 +1170,7 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value, if (!value) { /* memory fail */ - return NULL; + goto fail; } } @@ -1183,6 +1183,13 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value, /* malformed. */ *ep = value; +fail: + if (item->child != NULL) + { + cJSON_Delete(item->child); + item->child = NULL; + } + return NULL; }