Skip to content

Commit

Permalink
Fix #189, ensure returns an invalid pointer
Browse files Browse the repository at this point in the history
If realloc returns NULL, ensure didn't abort but returned
printbuffer.offset instead. If an attacker can control
printbuffer.offset and also make realloc fail at just the right moment,
this would make cJSON potentially write at an arbitrary memory address.
  • Loading branch information
FSMaxB committed Jul 12, 2017
1 parent ecdff78 commit 954d61e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
8 changes: 8 additions & 0 deletions cJSON.c
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,14 @@ static unsigned char* ensure(printbuffer * const p, size_t needed)
{
/* reallocate with realloc if available */
newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize);
if (newbuffer == NULL)
{
p->hooks.deallocate(p->buffer);
p->length = 0;
p->buffer = NULL;

return NULL;
}
}
else
{
Expand Down
18 changes: 17 additions & 1 deletion tests/misc_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,22 @@ static void cjson_functions_shouldnt_crash_with_null_pointers(void)
cJSON_Delete(item);
}

static void *failing_realloc(void *pointer, size_t size)
{
(void)size;
(void)pointer;
return NULL;
}

static void ensure_should_fail_on_failed_realloc(void)
{
printbuffer buffer = {NULL, 10, 0, 0, false, false, {&malloc, &free, &failing_realloc}};
buffer.buffer = (unsigned char*)malloc(100);
TEST_ASSERT_NOT_NULL(buffer.buffer);

TEST_ASSERT_NULL_MESSAGE(ensure(&buffer, 200), "Ensure didn't fail with failing realloc.");
}

int main(void)
{
UNITY_BEGIN();
Expand All @@ -425,6 +441,6 @@ int main(void)
RUN_TEST(cjson_replace_item_via_pointer_should_replace_items);
RUN_TEST(cjson_replace_item_in_object_should_preserve_name);
RUN_TEST(cjson_functions_shouldnt_crash_with_null_pointers);

RUN_TEST(ensure_should_fail_on_failed_realloc);
return UNITY_END();
}

0 comments on commit 954d61e

Please sign in to comment.