From f33fa95f3d4411bc8b9624d5ae8ecc9b22d1ff1c Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 9 Jan 2018 20:49:03 +0100 Subject: [PATCH 1/4] print: Fix default buffer size in printbuffer Thanks @liuyunbin for reporting this in #230 --- cJSON.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cJSON.c b/cJSON.c index 2f747ea9..71ac65c1 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1087,13 +1087,15 @@ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) { + static const size_t default_buffer_size = 256; printbuffer buffer[1]; unsigned char *printed = NULL; memset(buffer, 0, sizeof(buffer)); /* create buffer */ - buffer->buffer = (unsigned char*) hooks->allocate(256); + buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size); + buffer->length = default_buffer_size; buffer->format = format; buffer->hooks = *hooks; if (buffer->buffer == NULL) From 28d4410f42a64515290ce94688bcbbb9b2337c1f Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 9 Jan 2018 20:53:33 +0100 Subject: [PATCH 2/4] print: fix: realloc was allocating too much memory Thanks @liuyunbin for reporting this in #230 --- cJSON.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON.c b/cJSON.c index 71ac65c1..9b6ef33b 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1113,7 +1113,7 @@ static unsigned char *print(const cJSON * const item, cJSON_bool format, const i /* check if reallocate is available */ if (hooks->reallocate != NULL) { - printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1); buffer->buffer = NULL; if (printed == NULL) { goto fail; From 4d84acf9266e9dc0366a01171d4b0fb1410910a2 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 9 Jan 2018 21:40:55 +0100 Subject: [PATCH 3/4] print_number: fix Off-By-One error Thanks @liuyunbin for reporting this in #230 --- cJSON.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cJSON.c b/cJSON.c index 9b6ef33b..4cfc7195 100644 --- a/cJSON.c +++ b/cJSON.c @@ -512,7 +512,7 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out } /* reserve appropriate space in the output */ - output_pointer = ensure(output_buffer, (size_t)length); + output_pointer = ensure(output_buffer, (size_t)length + sizeof("")); if (output_pointer == NULL) { return false; From b60b5d37444c629b67782d38c4c75a40db242db7 Mon Sep 17 00:00:00 2001 From: Max Bruckner Date: Tue, 9 Jan 2018 21:59:42 +0100 Subject: [PATCH 4/4] Update version to 1.7.1 --- CHANGELOG.md | 7 +++++++ CMakeLists.txt | 2 +- Makefile | 2 +- cJSON.c | 2 +- cJSON.h | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d1a2dbf..e5bcdb63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +1.7.1 +===== +Fixes: +------ +* Fixed an Off-By-One error that could lead to an out of bounds write. Thanks @liuyunbin for reporting (see #230) +* Fixed two errors with buffered printing. Thanks @liuyunbin for reporting (see #230) + 1.7.0 ===== Features: diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b3c33cb..15e440d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ include(GNUInstallDirs) set(PROJECT_VERSION_MAJOR 1) set(PROJECT_VERSION_MINOR 7) -set(PROJECT_VERSION_PATCH 0) +set(PROJECT_VERSION_PATCH 1) set(CJSON_VERSION_SO 1) set(CJSON_UTILS_VERSION_SO 1) set(PROJECT_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") diff --git a/Makefile b/Makefile index 75c12c9d..941e561e 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ CJSON_TEST_SRC = cJSON.c test.c LDLIBS = -lm -LIBVERSION = 1.7.0 +LIBVERSION = 1.7.1 CJSON_SOVERSION = 1 UTILS_SOVERSION = 1 diff --git a/cJSON.c b/cJSON.c index 4cfc7195..d20c676e 100644 --- a/cJSON.c +++ b/cJSON.c @@ -82,7 +82,7 @@ CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item) { } /* 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 != 0) +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 1) #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. #endif diff --git a/cJSON.h b/cJSON.h index 770e1ef6..52101e11 100644 --- a/cJSON.h +++ b/cJSON.h @@ -31,7 +31,7 @@ extern "C" /* project version */ #define CJSON_VERSION_MAJOR 1 #define CJSON_VERSION_MINOR 7 -#define CJSON_VERSION_PATCH 0 +#define CJSON_VERSION_PATCH 1 #include