|
@@ -963,6 +963,11 @@ static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+ if (cannot_access_at_index(buffer, 0))
|
|
|
+ {
|
|
|
+ return buffer;
|
|
|
+ }
|
|
|
+
|
|
|
while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32))
|
|
|
{
|
|
|
buffer->offset++;
|
|
@@ -992,9 +997,24 @@ static parse_buffer *skip_utf8_bom(parse_buffer * const buffer)
|
|
|
return buffer;
|
|
|
}
|
|
|
|
|
|
-/* Parse an object - create a new root, and populate. */
|
|
|
CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)
|
|
|
{
|
|
|
+ size_t buffer_length;
|
|
|
+
|
|
|
+ if (NULL == value)
|
|
|
+ {
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Adding null character size due to require_null_terminated. */
|
|
|
+ buffer_length = strlen(value) + sizeof("");
|
|
|
+
|
|
|
+ return cJSON_ParseWithLengthOpts(value, buffer_length, return_parse_end, require_null_terminated);
|
|
|
+}
|
|
|
+
|
|
|
+/* Parse an object - create a new root, and populate. */
|
|
|
+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_bool require_null_terminated)
|
|
|
+{
|
|
|
parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };
|
|
|
cJSON *item = NULL;
|
|
|
|
|
@@ -1002,13 +1022,13 @@ CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return
|
|
|
global_error.json = NULL;
|
|
|
global_error.position = 0;
|
|
|
|
|
|
- if (value == NULL)
|
|
|
+ if (value == NULL || 0 == buffer_length)
|
|
|
{
|
|
|
goto fail;
|
|
|
}
|
|
|
|
|
|
buffer.content = (const unsigned char*)value;
|
|
|
- buffer.length = strlen(value) + sizeof("");
|
|
|
+ buffer.length = buffer_length;
|
|
|
buffer.offset = 0;
|
|
|
buffer.hooks = global_hooks;
|
|
|
|
|
@@ -1078,6 +1098,11 @@ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)
|
|
|
return cJSON_ParseWithOpts(value, 0, 0);
|
|
|
}
|
|
|
|
|
|
+CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length)
|
|
|
+{
|
|
|
+ return cJSON_ParseWithLengthOpts(value, buffer_length, 0, 0);
|
|
|
+}
|
|
|
+
|
|
|
#define cjson_min(a, b) (((a) < (b)) ? (a) : (b))
|
|
|
|
|
|
static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks)
|