mirror of
https://github.com/DaveGamble/cJSON.git
synced 2023-08-10 21:13:26 +03:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d348621ca9 | ||
|
|
744e47353a | ||
|
|
7795249dd4 | ||
|
|
324a6ac9a9 | ||
|
|
6ea4c01e4e | ||
|
|
9226e4ed8c | ||
|
|
7b6645794d | ||
|
|
4100379a04 | ||
|
|
2f6fc7f0f2 | ||
|
|
a1e1c208ff | ||
|
|
9bf4960cd5 | ||
|
|
488169faca | ||
|
|
9931900768 |
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -6,3 +6,6 @@
|
|||||||
.github export-ignore
|
.github export-ignore
|
||||||
.editorconfig export-ignore
|
.editorconfig export-ignore
|
||||||
.travis.yml export-ignore
|
.travis.yml export-ignore
|
||||||
|
|
||||||
|
# Linguist incorrectly identified the headers as C++, manually override this.
|
||||||
|
*.h linguist-language=C
|
||||||
|
|||||||
10
CHANGELOG.md
10
CHANGELOG.md
@@ -1,3 +1,13 @@
|
|||||||
|
1.7.15 (Aug 25, 2021)
|
||||||
|
======
|
||||||
|
Fixes:
|
||||||
|
------
|
||||||
|
* Fix potential core dumped for strrchr, see [#546](https://github.com/DaveGamble/cJSON/pull/546)
|
||||||
|
* Fix null pointer crash in cJSON_CreateXxArray, see [#538](https://github.com/DaveGamble/cJSON/pull/538)
|
||||||
|
* Fix several null pointer problems on allocation failure, see [#526](https://github.com/DaveGamble/cJSON/pull/526)
|
||||||
|
* Fix a possible dereference of null pointer, see [#519](https://github.com/DaveGamble/cJSON/pull/519)
|
||||||
|
* Fix windows build failure about defining nan, see [#518](https://github.com/DaveGamble/cJSON/pull/518)
|
||||||
|
|
||||||
1.7.14 (Sep 3, 2020)
|
1.7.14 (Sep 3, 2020)
|
||||||
======
|
======
|
||||||
Fixes:
|
Fixes:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ include(GNUInstallDirs)
|
|||||||
|
|
||||||
set(PROJECT_VERSION_MAJOR 1)
|
set(PROJECT_VERSION_MAJOR 1)
|
||||||
set(PROJECT_VERSION_MINOR 7)
|
set(PROJECT_VERSION_MINOR 7)
|
||||||
set(PROJECT_VERSION_PATCH 14)
|
set(PROJECT_VERSION_PATCH 15)
|
||||||
set(CJSON_VERSION_SO 1)
|
set(CJSON_VERSION_SO 1)
|
||||||
set(CJSON_UTILS_VERSION_SO 1)
|
set(CJSON_UTILS_VERSION_SO 1)
|
||||||
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -8,7 +8,7 @@ CJSON_TEST_SRC = cJSON.c test.c
|
|||||||
|
|
||||||
LDLIBS = -lm
|
LDLIBS = -lm
|
||||||
|
|
||||||
LIBVERSION = 1.7.14
|
LIBVERSION = 1.7.15
|
||||||
CJSON_SOVERSION = 1
|
CJSON_SOVERSION = 1
|
||||||
UTILS_SOVERSION = 1
|
UTILS_SOVERSION = 1
|
||||||
|
|
||||||
|
|||||||
37
cJSON.c
37
cJSON.c
@@ -78,8 +78,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef NAN
|
#ifndef NAN
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define NAN sqrt(-1.0)
|
||||||
|
#else
|
||||||
#define NAN 0.0/0.0
|
#define NAN 0.0/0.0
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const unsigned char *json;
|
const unsigned char *json;
|
||||||
@@ -113,7 +117,7 @@ CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */
|
/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */
|
||||||
#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 14)
|
#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 15)
|
||||||
#error cJSON.h and cJSON.c have different versions. Make sure that both have the same.
|
#error cJSON.h and cJSON.c have different versions. Make sure that both have the same.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -507,10 +511,8 @@ static unsigned char* ensure(printbuffer * const p, size_t needed)
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (newbuffer)
|
|
||||||
{
|
memcpy(newbuffer, p->buffer, p->offset + 1);
|
||||||
memcpy(newbuffer, p->buffer, p->offset + 1);
|
|
||||||
}
|
|
||||||
p->hooks.deallocate(p->buffer);
|
p->hooks.deallocate(p->buffer);
|
||||||
}
|
}
|
||||||
p->length = newsize;
|
p->length = newsize;
|
||||||
@@ -2544,6 +2546,7 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
a = cJSON_CreateArray();
|
a = cJSON_CreateArray();
|
||||||
|
|
||||||
for(i = 0; a && (i < (size_t)count); i++)
|
for(i = 0; a && (i < (size_t)count); i++)
|
||||||
{
|
{
|
||||||
n = cJSON_CreateNumber(numbers[i]);
|
n = cJSON_CreateNumber(numbers[i]);
|
||||||
@@ -2562,7 +2565,10 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count)
|
|||||||
}
|
}
|
||||||
p = n;
|
p = n;
|
||||||
}
|
}
|
||||||
a->child->prev = n;
|
|
||||||
|
if (a && a->child) {
|
||||||
|
a->child->prev = n;
|
||||||
|
}
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@@ -2599,7 +2605,10 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count)
|
|||||||
}
|
}
|
||||||
p = n;
|
p = n;
|
||||||
}
|
}
|
||||||
a->child->prev = n;
|
|
||||||
|
if (a && a->child) {
|
||||||
|
a->child->prev = n;
|
||||||
|
}
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@@ -2618,7 +2627,7 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count)
|
|||||||
|
|
||||||
a = cJSON_CreateArray();
|
a = cJSON_CreateArray();
|
||||||
|
|
||||||
for(i = 0;a && (i < (size_t)count); i++)
|
for(i = 0; a && (i < (size_t)count); i++)
|
||||||
{
|
{
|
||||||
n = cJSON_CreateNumber(numbers[i]);
|
n = cJSON_CreateNumber(numbers[i]);
|
||||||
if(!n)
|
if(!n)
|
||||||
@@ -2636,7 +2645,10 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count)
|
|||||||
}
|
}
|
||||||
p = n;
|
p = n;
|
||||||
}
|
}
|
||||||
a->child->prev = n;
|
|
||||||
|
if (a && a->child) {
|
||||||
|
a->child->prev = n;
|
||||||
|
}
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@@ -2673,7 +2685,10 @@ CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int co
|
|||||||
}
|
}
|
||||||
p = n;
|
p = n;
|
||||||
}
|
}
|
||||||
a->child->prev = n;
|
|
||||||
|
if (a && a->child) {
|
||||||
|
a->child->prev = n;
|
||||||
|
}
|
||||||
|
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@@ -2961,7 +2976,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item)
|
|||||||
|
|
||||||
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive)
|
CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive)
|
||||||
{
|
{
|
||||||
if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a))
|
if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
4
cJSON.h
4
cJSON.h
@@ -81,7 +81,7 @@ then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJ
|
|||||||
/* project version */
|
/* project version */
|
||||||
#define CJSON_VERSION_MAJOR 1
|
#define CJSON_VERSION_MAJOR 1
|
||||||
#define CJSON_VERSION_MINOR 7
|
#define CJSON_VERSION_MINOR 7
|
||||||
#define CJSON_VERSION_PATCH 14
|
#define CJSON_VERSION_PATCH 15
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
@@ -256,7 +256,7 @@ CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * cons
|
|||||||
|
|
||||||
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
||||||
* The input pointer json cannot point to a read-only address area, such as a string constant,
|
* The input pointer json cannot point to a read-only address area, such as a string constant,
|
||||||
* but should point to a readable and writable adress area. */
|
* but should point to a readable and writable address area. */
|
||||||
CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
||||||
|
|
||||||
/* Helper functions for creating and adding items to an object at the same time.
|
/* Helper functions for creating and adding items to an object at the same time.
|
||||||
|
|||||||
@@ -960,7 +960,9 @@ static int apply_patch(cJSON *object, const cJSON *patch, const cJSON_bool case_
|
|||||||
|
|
||||||
/* split pointer in parent and child */
|
/* split pointer in parent and child */
|
||||||
parent_pointer = cJSONUtils_strdup((unsigned char*)path->valuestring);
|
parent_pointer = cJSONUtils_strdup((unsigned char*)path->valuestring);
|
||||||
child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/');
|
if (parent_pointer) {
|
||||||
|
child_pointer = (unsigned char*)strrchr((char*)parent_pointer, '/');
|
||||||
|
}
|
||||||
if (child_pointer != NULL)
|
if (child_pointer != NULL)
|
||||||
{
|
{
|
||||||
child_pointer[0] = '\0';
|
child_pointer[0] = '\0';
|
||||||
@@ -1406,6 +1408,10 @@ static cJSON *generate_merge_patch(cJSON * const from, cJSON * const to, const c
|
|||||||
from_child = from->child;
|
from_child = from->child;
|
||||||
to_child = to->child;
|
to_child = to->child;
|
||||||
patch = cJSON_CreateObject();
|
patch = cJSON_CreateObject();
|
||||||
|
if (patch == NULL)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
while (from_child || to_child)
|
while (from_child || to_child)
|
||||||
{
|
{
|
||||||
int diff;
|
int diff;
|
||||||
|
|||||||
@@ -117,6 +117,50 @@ static void cjson_add_true_should_fail_on_allocation_failure(void)
|
|||||||
cJSON_Delete(root);
|
cJSON_Delete(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cjson_create_int_array_should_fail_on_allocation_failure(void)
|
||||||
|
{
|
||||||
|
int numbers[] = {1, 2, 3};
|
||||||
|
|
||||||
|
cJSON_InitHooks(&failing_hooks);
|
||||||
|
|
||||||
|
TEST_ASSERT_NULL(cJSON_CreateIntArray(numbers, 3));
|
||||||
|
|
||||||
|
cJSON_InitHooks(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cjson_create_float_array_should_fail_on_allocation_failure(void)
|
||||||
|
{
|
||||||
|
float numbers[] = {1.0f, 2.0f, 3.0f};
|
||||||
|
|
||||||
|
cJSON_InitHooks(&failing_hooks);
|
||||||
|
|
||||||
|
TEST_ASSERT_NULL(cJSON_CreateFloatArray(numbers, 3));
|
||||||
|
|
||||||
|
cJSON_InitHooks(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cjson_create_double_array_should_fail_on_allocation_failure(void)
|
||||||
|
{
|
||||||
|
double numbers[] = {1.0, 2.0, 3.0};
|
||||||
|
|
||||||
|
cJSON_InitHooks(&failing_hooks);
|
||||||
|
|
||||||
|
TEST_ASSERT_NULL(cJSON_CreateDoubleArray(numbers, 3));
|
||||||
|
|
||||||
|
cJSON_InitHooks(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void cjson_create_string_array_should_fail_on_allocation_failure(void)
|
||||||
|
{
|
||||||
|
const char* strings[] = {"1", "2", "3"};
|
||||||
|
|
||||||
|
cJSON_InitHooks(&failing_hooks);
|
||||||
|
|
||||||
|
TEST_ASSERT_NULL(cJSON_CreateStringArray(strings, 3));
|
||||||
|
|
||||||
|
cJSON_InitHooks(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void cjson_add_false_should_add_false(void)
|
static void cjson_add_false_should_add_false(void)
|
||||||
{
|
{
|
||||||
cJSON *root = cJSON_CreateObject();
|
cJSON *root = cJSON_CreateObject();
|
||||||
@@ -390,6 +434,11 @@ int CJSON_CDECL main(void)
|
|||||||
RUN_TEST(cjson_add_true_should_fail_with_null_pointers);
|
RUN_TEST(cjson_add_true_should_fail_with_null_pointers);
|
||||||
RUN_TEST(cjson_add_true_should_fail_on_allocation_failure);
|
RUN_TEST(cjson_add_true_should_fail_on_allocation_failure);
|
||||||
|
|
||||||
|
RUN_TEST(cjson_create_int_array_should_fail_on_allocation_failure);
|
||||||
|
RUN_TEST(cjson_create_float_array_should_fail_on_allocation_failure);
|
||||||
|
RUN_TEST(cjson_create_double_array_should_fail_on_allocation_failure);
|
||||||
|
RUN_TEST(cjson_create_string_array_should_fail_on_allocation_failure);
|
||||||
|
|
||||||
RUN_TEST(cjson_add_false_should_add_false);
|
RUN_TEST(cjson_add_false_should_add_false);
|
||||||
RUN_TEST(cjson_add_false_should_fail_with_null_pointers);
|
RUN_TEST(cjson_add_false_should_fail_with_null_pointers);
|
||||||
RUN_TEST(cjson_add_false_should_fail_on_allocation_failure);
|
RUN_TEST(cjson_add_false_should_fail_on_allocation_failure);
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ static cJSON_bool test_apply_patch(const cJSON * const test)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("Testing unkown\n");
|
printf("Testing unknown\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
disabled = cJSON_GetObjectItemCaseSensitive(test, "disabled");
|
disabled = cJSON_GetObjectItemCaseSensitive(test, "disabled");
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ static char* create_monitor(void)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
/* after creation was successful, immediately add it to the monitor,
|
/* after creation was successful, immediately add it to the monitor,
|
||||||
* thereby transfering ownership of the pointer to it */
|
* thereby transferring ownership of the pointer to it */
|
||||||
cJSON_AddItemToObject(monitor, "name", name);
|
cJSON_AddItemToObject(monitor, "name", name);
|
||||||
|
|
||||||
resolutions = cJSON_CreateArray();
|
resolutions = cJSON_CreateArray();
|
||||||
|
|||||||
Reference in New Issue
Block a user