From f860d3dd1b52b6cec3e69b9212641414a4ede9d1 Mon Sep 17 00:00:00 2001 From: Krzysztof Gabis Date: Sat, 16 Apr 2016 12:30:46 +0100 Subject: [PATCH] Accepting json texts that are not objects or arrays. According to RFC 7159 it's now valid to accept json texts that are not object or arrays. Also reordered realloc opeartion in json_object_add to not be called if key already exists. --- parson.c | 16 ++++------------ tests.c | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/parson.c b/parson.c index 112d742..bd803e5 100644 --- a/parson.c +++ b/parson.c @@ -241,7 +241,7 @@ static char * read_file(const char * filename) { file_contents = (char*)parson_malloc(sizeof(char) * (file_size + 1)); if (!file_contents) { fclose(fp); - return NULL; + return NULL; } if (fread(file_contents, file_size, 1, fp) < 1) { if (ferror(fp)) { @@ -303,6 +303,9 @@ static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_V if (object == NULL || name == NULL || value == NULL) { return JSONFailure; } + if (json_object_get_value(object, name) != NULL) { + return JSONFailure; + } if (object->count >= object->capacity) { size_t new_capacity = MAX(object->capacity * 2, STARTING_CAPACITY); if (new_capacity > OBJECT_MAX_CAPACITY) @@ -310,8 +313,6 @@ static JSON_Status json_object_add(JSON_Object *object, const char *name, JSON_V if (json_object_resize(object, new_capacity) == JSONFailure) return JSONFailure; } - if (json_object_get_value(object, name) != NULL) - return JSONFailure; index = object->count; object->names[index] = parson_strdup(name); if (object->names[index] == NULL) @@ -546,8 +547,6 @@ static char * get_quoted_string(const char **string) { const char *string_start = *string; size_t string_len = 0; skip_quotes(string); - if (**string == '\0') - return NULL; string_len = *string - string_start - 2; /* length without quotes */ return process_string(string_start + 1, string_len); } @@ -904,9 +903,6 @@ JSON_Value * json_parse_file_with_comments(const char *filename) { JSON_Value * json_parse_string(const char *string) { if (string == NULL) return NULL; - SKIP_WHITESPACES(&string); - if (*string != '{' && *string != '[') - return NULL; return parse_value((const char**)&string, 0); } @@ -920,10 +916,6 @@ JSON_Value * json_parse_string_with_comments(const char *string) { remove_comments(string_mutable_copy, "//", "\n"); string_mutable_copy_ptr = string_mutable_copy; SKIP_WHITESPACES(&string_mutable_copy_ptr); - if (*string_mutable_copy_ptr != '{' && *string_mutable_copy_ptr != '[') { - parson_free(string_mutable_copy); - return NULL; - } result = parse_value((const char**)&string_mutable_copy_ptr, 0); parson_free(string_mutable_copy); return result; diff --git a/tests.c b/tests.c index 5f04326..4cd5e2e 100644 --- a/tests.c +++ b/tests.c @@ -41,7 +41,7 @@ void test_suite_1(void); /* Test 3 files from json.org + serialization*/ void test_suite_2(JSON_Value *value); /* Test correctness of parsed values */ void test_suite_2_no_comments(void); void test_suite_2_with_comments(void); -void test_suite_3(void); /* Test incorrect values */ +void test_suite_3(void); /* Test parsing valid and invalid strings */ void test_suite_4(void); /* Test deep copy funtion */ void test_suite_5(void); /* Test building json values from scratch */ void test_suite_6(void); /* Test value comparing verification */ @@ -63,6 +63,7 @@ int main() { /* print_commits_info("torvalds", "linux"); */ /* serialization_example(); */ /* persistence_example(); */ + test_suite_1(); test_suite_2_no_comments(); test_suite_2_with_comments(); @@ -199,6 +200,16 @@ void test_suite_2_with_comments(void) { void test_suite_3(void) { char nested_20x[] = "[[[[[[[[[[[[[[[[[[[[\"hi\"]]]]]]]]]]]]]]]]]]]]"; + + puts("Testing valid strings:"); + TEST(json_parse_string("{\"lorem\":\"ipsum\"}") != NULL); + TEST(json_parse_string("[\"lorem\"]") != NULL); + TEST(json_parse_string("null") != NULL); + TEST(json_parse_string("true") != NULL); + TEST(json_parse_string("false") != NULL); + TEST(json_parse_string("\"string\"") != NULL); + TEST(json_parse_string("123") != NULL); + puts("Testing invalid strings:"); TEST(json_parse_string(NULL) == NULL); TEST(json_parse_string("") == NULL); /* empty string */ @@ -217,7 +228,6 @@ void test_suite_3(void) { TEST(json_parse_string("{") == NULL); TEST(json_parse_string("}") == NULL); TEST(json_parse_string("x") == NULL); - TEST(json_parse_string("\"string\"") == NULL); TEST(json_parse_string("{:\"no name\"}") == NULL); TEST(json_parse_string("[,\"no first value\"]") == NULL); TEST(json_parse_string("[\"\\u00zz\"]") == NULL); /* invalid utf value */