mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
parse_array: goto fail error handling
Makes the control flow easier to reason about and fixes a few potential memory leaks.
This commit is contained in:
parent
8656386c4f
commit
99cd9af7d5
17
cJSON.c
17
cJSON.c
@ -1127,7 +1127,7 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value,
|
|||||||
{
|
{
|
||||||
/* not an array! */
|
/* not an array! */
|
||||||
*ep = value;
|
*ep = value;
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
item->type = cJSON_Array;
|
item->type = cJSON_Array;
|
||||||
@ -1142,13 +1142,13 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value,
|
|||||||
if (!item->child)
|
if (!item->child)
|
||||||
{
|
{
|
||||||
/* memory fail */
|
/* memory fail */
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
/* skip any spacing, get the value. */
|
/* skip any spacing, get the value. */
|
||||||
value = skip(parse_value(child, skip(value), ep));
|
value = skip(parse_value(child, skip(value), ep));
|
||||||
if (!value)
|
if (!value)
|
||||||
{
|
{
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* loop through the comma separated array elements */
|
/* 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()))
|
if (!(new_item = cJSON_New_Item()))
|
||||||
{
|
{
|
||||||
/* memory fail */
|
/* memory fail */
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
/* add new item to end of the linked list */
|
/* add new item to end of the linked list */
|
||||||
child->next = new_item;
|
child->next = new_item;
|
||||||
@ -1170,7 +1170,7 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value,
|
|||||||
if (!value)
|
if (!value)
|
||||||
{
|
{
|
||||||
/* memory fail */
|
/* memory fail */
|
||||||
return NULL;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1183,6 +1183,13 @@ static const unsigned char *parse_array(cJSON *item, const unsigned char *value,
|
|||||||
/* malformed. */
|
/* malformed. */
|
||||||
*ep = value;
|
*ep = value;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (item->child != NULL)
|
||||||
|
{
|
||||||
|
cJSON_Delete(item->child);
|
||||||
|
item->child = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user