From 566952de5ead2c6701276d5596abc49b4583ab91 Mon Sep 17 00:00:00 2001 From: rexy712 Date: Fri, 30 Nov 2018 14:12:39 -0800 Subject: [PATCH] Fixed a potential segfault and added diagnostics option to cmake --- CMakeLists.txt | 5 +++++ src/input.c | 8 +++++++- src/output.c | 4 ++++ src/strings.c | 9 +++++++-- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c1e065..be6c1d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,8 +12,13 @@ configure_file( ) include_directories("${INCLUDE_PATH}") +option(ENABLE_DIAGNOSTICS "Print diagnostic messages when parsing json to help identify issues" ON) + add_library (rjp STATIC src/input.c src/output.c src/strings.c) set_target_properties(rjp PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.h) +if(ENABLE_DIAGNOSTICS) + target_compile_definitions(rjp PRIVATE RJP_DIAGNOSTICS) +endif() install(TARGETS rjp ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} diff --git a/src/input.c b/src/input.c index b6d9c6f..2d536fe 100644 --- a/src/input.c +++ b/src/input.c @@ -31,6 +31,12 @@ #define MAYBE_UNUSED #endif +#ifdef RJP_DIAGNOSTICS +#define DIAG_PRINT(...) fprintf(__VA_ARGS__) +#else +#define DIAG_PRINT(...) +#endif + struct JSON_state{ int in_array; int search_target; @@ -205,7 +211,7 @@ MAYBE_UNUSED static int _rjp__is_array_empty(struct JSON_value* curr){ } #define syntax_error(msg, row, column)\ - do{fprintf(stderr, "Syntax error! %s (%i:%i)\n", msg, row, column);rjp_free(root);return NULL;}while(0) + do{DIAG_PRINT(stderr, "Syntax error! %s (%i:%i)\n", msg, row, column);rjp_free(root);return NULL;}while(0) #define MAX_DEPTH 16 struct JSON_value* rjp_parse(const char* str){ diff --git a/src/output.c b/src/output.c index f830ac0..1f75204 100644 --- a/src/output.c +++ b/src/output.c @@ -117,7 +117,11 @@ size_t rjp_dump_object(struct JSON_value* root, char* dest){ } char* rjp_to_json(struct JSON_value* root){ + if(!root) + return NULL; size_t len = _rjp__object_strlen(root); + if(!len) + return NULL; char* tmp = malloc(len + 1); tmp[len] = 0; size_t pos = 1; diff --git a/src/strings.c b/src/strings.c index 94b29e5..8988c31 100644 --- a/src/strings.c +++ b/src/strings.c @@ -162,6 +162,8 @@ size_t _rjp__object_strlen(struct JSON_value* root){ struct JSON_object* root_obj = &root->object; struct JSON_object_member* member_list = root_obj->members; for(;member_list;member_list = member_list->next){ + if(member_list->name.length == 0 || member_list->name.value[0] == 0) + return 0; count += member_list->name.length + 3; //"": switch(member_list->value.type){ case json_integer: @@ -182,8 +184,11 @@ size_t _rjp__object_strlen(struct JSON_value* root){ case json_array: count += _rjp__array_strlen(&member_list->value); break; - case json_object: - count += _rjp__object_strlen(&member_list->value); + case json_object:; + size_t new_count = _rjp__object_strlen(&member_list->value); + if(!new_count) + return 0; + count += new_count; break; }; if(member_list->next)