diff --git a/cJSON.c b/cJSON.c index 442c3ac..e386dcf 100644 --- a/cJSON.c +++ b/cJSON.c @@ -1038,6 +1038,7 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) buffer->offset++; } + /* step back if we went over the end */ if (buffer->offset == buffer->length) { buffer->offset--; @@ -1063,7 +1064,7 @@ static parse_buffer *skip_utf8_bom(parse_buffer * const buffer) } /* Parse an object - create a new root, and populate. */ -static cJSON *parse(const char * const json, internal_context * const context) +static cJSON *parse(const char * const json, const size_t length, internal_context * const context) { parse_buffer buffer = { 0, 0, 0, 0, default_context }; cJSON *item = NULL; @@ -1078,7 +1079,7 @@ static cJSON *parse(const char * const json, internal_context * const context) } buffer.content = (const unsigned char*)json; - buffer.length = strlen(json) + sizeof(""); + buffer.length = length; buffer.offset = 0; buffer.context = *context; @@ -1113,7 +1114,6 @@ fail: delete_item(item, context); } - if (json != NULL) { error local_error; local_error.json = (const unsigned char*)json; @@ -1141,8 +1141,13 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *json, const char **return_ internal_context context = global_context; cJSON *item = NULL; + if (json == NULL) + { + return NULL; + } + context.allow_data_after_json = !require_null_terminated; - item = parse(json, &context); + item = parse(json, strlen((const char*)json) + sizeof(""), &context); if (return_parse_end != NULL) { @@ -1155,7 +1160,12 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *json, const char **return_ /* Default options for cJSON_Parse */ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *json) { - return parse(json, &global_context); + if (json == NULL) + { + return NULL; + } + + return parse(json, strlen((const char*)json) + sizeof(""), &global_context); } #define cjson_min(a, b) (((a) < (b)) ? (a) : (b))