aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Badoux <n.badoux@hotmail.com>2024-08-25 23:18:14 +0200
committerAlan Wang <wp_scut@163.com>2024-08-30 11:29:05 +0800
commita78d975537a8df40d58a96f8ce326d7fb625e1e5 (patch)
tree548d65f2921c790446dd723b002656fad5103032
parentf28a468e3b287d633fea5d4d5ab444bb9354b4bc (diff)
downloadcjson-a78d975537a8df40d58a96f8ce326d7fb625e1e5.tar.gz
cjson-a78d975537a8df40d58a96f8ce326d7fb625e1e5.zip
cJSON_DetachItemViaPointer: added test and fix for check for null in item->prev
-rw-r--r--cJSON.c2
-rw-r--r--tests/misc_tests.c16
2 files changed, 17 insertions, 1 deletions
diff --git a/cJSON.c b/cJSON.c
index 483d0c0..fe22bd8 100644
--- a/cJSON.c
+++ b/cJSON.c
@@ -2204,7 +2204,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) || (parent->child == NULL) || (item == NULL) || (item->prev == NULL))
+ if ((parent == NULL) || (item == NULL) || (item != parent->child && item->prev == NULL))
{
return NULL;
}
diff --git a/tests/misc_tests.c b/tests/misc_tests.c
index ba3e003..b9c59e7 100644
--- a/tests/misc_tests.c
+++ b/tests/misc_tests.c
@@ -280,6 +280,21 @@ static void cjson_detach_item_via_pointer_should_detach_items(void)
TEST_ASSERT_NULL_MESSAGE(parent->child, "Child of the parent wasn't set to NULL.");
}
+static void cjson_detach_item_via_pointer_should_return_null_if_item_prev_is_null(void)
+{
+ cJSON list[2];
+ cJSON parent[1];
+
+ memset(list, '\0', sizeof(list));
+
+ /* link the list */
+ list[0].next = &(list[1]);
+
+ parent->child = &list[0];
+ TEST_ASSERT_NULL_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[1])), "Failed to detach in the middle.");
+ TEST_ASSERT_TRUE_MESSAGE(cJSON_DetachItemViaPointer(parent, &(list[0])) == &(list[0]), "Failed to detach in the middle.");
+}
+
static void cjson_replace_item_via_pointer_should_replace_items(void)
{
cJSON replacements[3];
@@ -746,6 +761,7 @@ int CJSON_CDECL main(void)
RUN_TEST(cjson_should_not_parse_to_deeply_nested_jsons);
RUN_TEST(cjson_set_number_value_should_set_numbers);
RUN_TEST(cjson_detach_item_via_pointer_should_detach_items);
+ RUN_TEST(cjson_detach_item_via_pointer_should_return_null_if_item_prev_is_null);
RUN_TEST(cjson_replace_item_via_pointer_should_replace_items);
RUN_TEST(cjson_replace_item_in_object_should_preserve_name);
RUN_TEST(cjson_functions_should_not_crash_with_null_pointers);