-
Notifications
You must be signed in to change notification settings - Fork 3.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix insufficient check in cJSON_DetachItemViaPointer #722
base: master
Are you sure you want to change the base?
fix insufficient check in cJSON_DetachItemViaPointer #722
Conversation
cJSON_DetachItemViaPointer() will crash if the detached item has field `prev` is null. The common suitation scenario is the detached item is created by cJSON_Create* APIs and directly pass it to cJSON_DetachItemViaPointer(object, item) call without adding item to object previously. Then the cJSON_DetachItemViaPointer() will crash because it does not check whether the passed item has valid `prev` field. As detach a non-existent item is an undesirable behavior, instead of raising an uneasy core dump, this commit adds the NULL check of `item->prev` in cJSON_DetachItemViaPointer and return NULL to inform user such unexpect behavior (as user will routinely free/handle the detached resources later). Signed-off-by: hopper-vul <hopper.vul@gmail.com>
The smallest case is
|
I think the null check of Just think about this scenario: |
@@ -2186,7 +2186,7 @@ CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * c | |||
|
|||
CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) | |||
{ | |||
if ((parent == NULL) || (item == NULL)) | |||
if ((parent == NULL) || (item == NULL) || (item->prev == NULL)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I prefer adding this null check to the place where item->prev
is used instead of here.
I mean:
if (item != parent->child)
{
if (item->prev == NULL)
{
return NULL;
}
/* not the first element */
item->prev->next = item->next;
}
|
cJSON_DetachItemViaPointer() will crash if the detached item has field
prev
is null. The common suitation scenario is the detached item is created by cJSON_Create* APIs and directly pass it to cJSON_DetachItemViaPointer(object, item) call without adding item to object previously. Then the cJSON_DetachItemViaPointer() will crash because it does not check whether the passed item has validprev
field.As detach a non-existent item is an undesirable behavior, instead of raising an uneasy core dump, this commit adds the NULL check of
item->prev
in cJSON_DetachItemViaPointer and return NULL to inform user such unexpect behavior (as user will routinely free/handle the detached resources later).Signed-off-by: hopper-vul hopper.vul@gmail.com