From 9782447a745e865e536a6e9e25779307b8fc4641 Mon Sep 17 00:00:00 2001 From: Rinat Ibragimov Date: Wed, 29 Apr 2015 22:44:17 +0300 Subject: [PATCH] free temporary JSON_Value's on failure --- parson.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 96 insertions(+), 12 deletions(-) diff --git a/parson.c b/parson.c index dd538c7..91ff3a0 100644 --- a/parson.c +++ b/parson.c @@ -1166,19 +1166,47 @@ JSON_Status json_array_replace_value(JSON_Array *array, size_t ix, JSON_Value *v } JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string) { - return json_array_replace_value(array, i, json_value_init_string(string)); + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number) { - return json_array_replace_value(array, i, json_value_init_number(number)); + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean) { - return json_array_replace_value(array, i, json_value_init_boolean(boolean)); + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_replace_null(JSON_Array *array, size_t i) { - return json_array_replace_value(array, i, json_value_init_null()); + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_array_replace_value(array, i, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_clear(JSON_Array *array) { @@ -1199,19 +1227,47 @@ JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value) { } JSON_Status json_array_append_string(JSON_Array *array, const char *string) { - return json_array_append_value(array, json_value_init_string(string)); + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_append_number(JSON_Array *array, double number) { - return json_array_append_value(array, json_value_init_number(number)); + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_append_boolean(JSON_Array *array, int boolean) { - return json_array_append_value(array, json_value_init_boolean(boolean)); + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_array_append_null(JSON_Array *array) { - return json_array_append_value(array, json_value_init_null()); + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_array_append_value(array, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value) { @@ -1282,19 +1338,47 @@ JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON } JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string) { - return json_object_dotset_value(object, name, json_value_init_string(string)); + JSON_Value *value = json_value_init_string(string); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number) { - return json_object_dotset_value(object, name, json_value_init_number(number)); + JSON_Value *value = json_value_init_number(number); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean) { - return json_object_dotset_value(object, name, json_value_init_boolean(boolean)); + JSON_Value *value = json_value_init_boolean(boolean); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_object_dotset_null(JSON_Object *object, const char *name) { - return json_object_dotset_value(object, name, json_value_init_null()); + JSON_Value *value = json_value_init_null(); + if (value == NULL) + return JSONFailure; + if (json_object_dotset_value(object, name, value) == JSONFailure) { + json_value_free(value); + return JSONFailure; + } + return JSONSuccess; } JSON_Status json_object_remove(JSON_Object *object, const char *name) {