mirror of
https://github.com/json-c/json-c.git
synced 2026-03-13 18:19:06 +08:00
Fix memory leak in test_safe_json_pointer_set, the caller must free the passed value when json_pointer_set failed. Also, reformat.
This commit is contained in:
@@ -23,17 +23,17 @@ static const char *input_json_str = "{ "
|
|||||||
|
|
||||||
static void test_example_set_with_limit_index(void)
|
static void test_example_set_with_limit_index(void)
|
||||||
{
|
{
|
||||||
struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
|
struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
|
||||||
size_t limit_index = 10;
|
size_t limit_index = 10;
|
||||||
|
|
||||||
// testing if json_pointer_set_with_limit_index() works as json_pointer_set()
|
// testing if json_pointer_set_with_limit_index() works as json_pointer_set()
|
||||||
assert(jo1 != NULL);
|
assert(jo1 != NULL);
|
||||||
printf("PASSED - SET_WITH_LIMIT - LOADED TEST JSON\n");
|
printf("PASSED - SET_WITH_LIMIT - LOADED TEST JSON\n");
|
||||||
printf("%s\n", json_object_get_string(jo1));
|
printf("%s\n", json_object_get_string(jo1));
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/1", json_object_new_string("cod"), limit_index));
|
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/1", json_object_new_string("cod"), limit_index));
|
||||||
assert(0 == strcmp("cod", json_object_get_string(json_object_array_get_idx(
|
assert(0 == strcmp("cod", json_object_get_string(json_object_array_get_idx(
|
||||||
json_object_object_get(jo1, "foo"), 1))));
|
json_object_object_get(jo1, "foo"), 1))));
|
||||||
printf("PASSED - SET_WITH_LIMIT - 'cod' in /foo/1\n");
|
printf("PASSED - SET_WITH_LIMIT - 'cod' in /foo/1\n");
|
||||||
assert(0 != json_pointer_set_with_limit_index(&jo1, "/fud/gaw", (jo2 = json_tokener_parse("[1,2,3]")), limit_index));
|
assert(0 != json_pointer_set_with_limit_index(&jo1, "/fud/gaw", (jo2 = json_tokener_parse("[1,2,3]")), limit_index));
|
||||||
assert(errno == ENOENT);
|
assert(errno == ENOENT);
|
||||||
@@ -79,31 +79,31 @@ static void test_example_set_with_limit_index(void)
|
|||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
json_object_put(jo2);
|
json_object_put(jo2);
|
||||||
|
|
||||||
// testing with limit_index
|
// testing with limit_index
|
||||||
jo1 = json_tokener_parse("{'foo': ['bar', 'baz']}");
|
jo1 = json_tokener_parse("{'foo': ['bar', 'baz']}");
|
||||||
jo2 = json_tokener_parse("{'foo': ['bar', 'cod']}");
|
jo2 = json_tokener_parse("{'foo': ['bar', 'cod']}");
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/1", json_object_new_string("cod"), limit_index));
|
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/1", json_object_new_string("cod"), limit_index));
|
||||||
assert(json_object_equal(jo1, jo2));
|
assert(json_object_equal(jo1, jo2));
|
||||||
printf("PASSED - SET_LIMIT - Set value within limit (/foo/1 with limit 10)\n");
|
printf("PASSED - SET_LIMIT - Set value within limit (/foo/1 with limit 10)\n");
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_limit_index(&jo1, "/bar", json_object_new_string("new_field"), limit_index));
|
assert(0 == json_pointer_set_with_limit_index(&jo1, "/bar", json_object_new_string("new_field"), limit_index));
|
||||||
printf("PASSED - SET_LIMIT - Set value on an object (limit is ignored)\n");
|
printf("PASSED - SET_LIMIT - Set value on an object (limit is ignored)\n");
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/20", json_object_new_string("big_index"), (size_t)-1));
|
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/20", json_object_new_string("big_index"), (size_t)-1));
|
||||||
printf("PASSED - SET_LIMIT - Set value with limit_index = -1 (no limit)\n");
|
printf("PASSED - SET_LIMIT - Set value with limit_index = -1 (no limit)\n");
|
||||||
|
|
||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
json_object_put(jo2);
|
json_object_put(jo2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_wrong_inputs_set_with_limit_index(void)
|
static void test_wrong_inputs_set_with_limit_index(void)
|
||||||
{
|
{
|
||||||
struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
|
struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
|
||||||
size_t limit_index = 10;
|
size_t limit_index = 10;
|
||||||
|
|
||||||
// testing if json_pointer_set_with_limit_index() works as json_pointer_set()
|
// testing if json_pointer_set_with_limit_index() works as json_pointer_set()
|
||||||
assert(jo1 != NULL);
|
assert(jo1 != NULL);
|
||||||
printf("PASSED - SET_WITH_LIMIT - LOADED TEST JSON\n");
|
printf("PASSED - SET_WITH_LIMIT - LOADED TEST JSON\n");
|
||||||
printf("%s\n", json_object_get_string(jo1));
|
printf("%s\n", json_object_get_string(jo1));
|
||||||
|
|
||||||
@@ -142,101 +142,108 @@ static void test_wrong_inputs_set_with_limit_index(void)
|
|||||||
|
|
||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
|
|
||||||
// testing with limit_index
|
// testing with limit_index
|
||||||
jo1 = json_tokener_parse("{'foo': ['bar', 'baz']}");
|
jo1 = json_tokener_parse("{'foo': ['bar', 'baz']}");
|
||||||
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
jo2 = json_object_new_string("out_of_bounds");
|
jo2 = json_object_new_string("out_of_bounds");
|
||||||
assert(0 != json_pointer_set_with_limit_index(&jo1, "/foo/20", jo2, limit_index));
|
assert(0 != json_pointer_set_with_limit_index(&jo1, "/foo/20", jo2, limit_index));
|
||||||
assert(errno == EINVAL);
|
assert(errno == EINVAL);
|
||||||
printf("PASSED - SET_LIMIT - Failed to set index 20 with limit 10\n");
|
printf("PASSED - SET_LIMIT - Failed to set index 20 with limit 10\n");
|
||||||
// The value object was not consumed, so we must put it.
|
// The value object was not consumed, so we must put it.
|
||||||
json_object_put(jo2);
|
json_object_put(jo2);
|
||||||
|
|
||||||
// corner case: setting an index that equals the limit (should be ok, as it's idx > max_idx)
|
// corner case: setting an index that equals the limit (should be ok, as it's idx > max_idx)
|
||||||
errno = 0;
|
errno = 0;
|
||||||
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/10", json_object_new_string("at_the_limit"), limit_index));
|
assert(0 == json_pointer_set_with_limit_index(&jo1, "/foo/10", json_object_new_string("at_the_limit"), limit_index));
|
||||||
printf("PASSED - SET_LIMIT - Succeeded to set index 10 with limit 10\n");
|
printf("PASSED - SET_LIMIT - Succeeded to set index 10 with limit 10\n");
|
||||||
|
|
||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// callback for testing json_pointer_set_with_cb()
|
// callback for testing json_pointer_set_with_cb()
|
||||||
static int test_cb_print_msg(json_object *parent, const char *key, size_t idx,
|
static int test_cb_print_msg(json_object *parent, const char *key, size_t idx,
|
||||||
json_object *value, void *priv)
|
json_object *value, void *priv)
|
||||||
{
|
{
|
||||||
printf("PASSED - SET_WITH_CB - This callback is called\n");
|
printf("PASSED - SET_WITH_CB - This callback is called\n");
|
||||||
return 0;
|
json_object_put(value);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// callback for testing json_pointer_set_with_cb() with rejection logic
|
// callback for testing json_pointer_set_with_cb() with rejection logic
|
||||||
static int test_cb_reject_logic(json_object *parent, const char *key, size_t idx,
|
static int test_cb_reject_logic(json_object *parent, const char *key, size_t idx,
|
||||||
json_object *value, void *priv)
|
json_object *value, void *priv)
|
||||||
{
|
{
|
||||||
// Reject any operation if the key is "reject"
|
// Reject any operation if the key is "reject"
|
||||||
if (key && strcmp(key, "reject") == 0)
|
if (key && strcmp(key, "reject") == 0)
|
||||||
{
|
{
|
||||||
printf("PASSED - SET_WITH_CB - Callback correctly identified key 'reject' to reject\n");
|
printf("PASSED - SET_WITH_CB - Callback correctly identified key 'reject' to reject\n");
|
||||||
return -1;
|
// Note: caller of json_pointer_set must free value
|
||||||
}
|
return -1;
|
||||||
return 0;
|
}
|
||||||
|
json_object_put(value);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_set_with_cb(void)
|
static void test_set_with_cb(void)
|
||||||
{
|
{
|
||||||
struct json_object *jo1 = json_tokener_parse(input_json_str);
|
struct json_object *jo2, *jo1 = json_tokener_parse(input_json_str);
|
||||||
size_t limit_index = 5;
|
size_t limit_index = 5;
|
||||||
|
|
||||||
assert(jo1 != NULL);
|
assert(jo1 != NULL);
|
||||||
printf("PASSED - SET_WITH_CB - LOADED TEST JSON\n");
|
printf("PASSED - SET_WITH_CB - LOADED TEST JSON\n");
|
||||||
printf("%s\n", json_object_get_string(jo1));
|
printf("%s\n", json_object_get_string(jo1));
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_cb(&jo1, "/foo/1", json_object_new_string("cod"), test_cb_print_msg, 1, NULL));
|
|
||||||
printf("PASSED - SET_WITH_CB - callback test_cb_print_msg for /foo/1\n");
|
assert(0 == json_pointer_set_with_cb(&jo1, "/foo/1", json_object_new_string("cod"), test_cb_print_msg, 1, NULL));
|
||||||
|
printf("PASSED - SET_WITH_CB - callback test_cb_print_msg for /foo/1\n");
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_cb(&jo1, "/foo/4", json_object_new_string("in"), json_object_array_put_with_idx_limit_cb, 0, &limit_index));
|
assert(0 == json_pointer_set_with_cb(&jo1, "/foo/4", json_object_new_string("in"), json_object_array_put_with_idx_limit_cb, 0, &limit_index));
|
||||||
printf("PASSED - SET_WITH_CB - callback json_object_array_put_with_idx_limit_cb for /foo/4 with limit_index 5\n");
|
printf("PASSED - SET_WITH_CB - callback json_object_array_put_with_idx_limit_cb for /foo/4 with limit_index 5\n");
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_cb(&jo1, "/foo/5", json_object_new_string("border"), json_object_array_put_with_idx_limit_cb, 0, &limit_index));
|
assert(0 == json_pointer_set_with_cb(&jo1, "/foo/5", json_object_new_string("border"), json_object_array_put_with_idx_limit_cb, 0, &limit_index));
|
||||||
printf("PASSED - SET_WITH_CB - failed with callback json_object_array_put_with_idx_limit_cb for /foo/5 with limit_index 5\n");
|
printf("PASSED - SET_WITH_CB - failed with callback json_object_array_put_with_idx_limit_cb for /foo/5 with limit_index 5\n");
|
||||||
|
|
||||||
assert(0 != json_pointer_set_with_cb(&jo1, "/foo/10", json_object_new_string("out"), json_object_array_put_with_idx_limit_cb, 0, &limit_index));
|
assert(0 != json_pointer_set_with_cb(&jo1, "/foo/10", (jo2 = json_object_new_string("out")), json_object_array_put_with_idx_limit_cb, 0, &limit_index));
|
||||||
assert(errno == EINVAL);
|
json_object_put(jo2);
|
||||||
printf("PASSED - SET_WITH_CB - failed with callback json_object_array_put_with_idx_limit_cb for /foo/10 with limit_index 5\n");
|
assert(errno == EINVAL);
|
||||||
|
printf("PASSED - SET_WITH_CB - failed with callback json_object_array_put_with_idx_limit_cb for /foo/10 with limit_index 5\n");
|
||||||
|
|
||||||
assert(0 != json_pointer_set_with_cb(&jo1, "/foo/2", json_object_new_string("null_priv"), json_object_array_put_with_idx_limit_cb, 0, NULL));
|
assert(0 != json_pointer_set_with_cb(&jo1, "/foo/2", (jo2 = json_object_new_string("null_priv")), json_object_array_put_with_idx_limit_cb, 0, NULL));
|
||||||
assert(errno == EFAULT);
|
json_object_put(jo2);
|
||||||
printf("PASSED - SET_WITH_CB - failed with callback json_object_array_put_with_idx_limit_cb with NULL priv\n");
|
assert(errno == EFAULT);
|
||||||
|
printf("PASSED - SET_WITH_CB - failed with callback json_object_array_put_with_idx_limit_cb with NULL priv\n");
|
||||||
|
|
||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
|
|
||||||
jo1 = json_tokener_parse("{'foo': 'bar'}");
|
jo1 = json_tokener_parse("{'foo': 'bar'}");
|
||||||
assert(jo1 != NULL);
|
assert(jo1 != NULL);
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_cb(&jo1, "/foo", json_object_new_string("cod"), test_cb_print_msg, 1, NULL));
|
assert(0 == json_pointer_set_with_cb(&jo1, "/foo", json_object_new_string("cod"), test_cb_print_msg, 1, NULL));
|
||||||
printf("PASSED - SET_WITH_CB - cb_handles_obj=1: callback was triggered for object operation\n");
|
printf("PASSED - SET_WITH_CB - cb_handles_obj=1: callback was triggered for object operation\n");
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_cb(&jo1, "/new_key", json_object_new_string("new_value"), test_cb_print_msg, 0, NULL));
|
assert(0 == json_pointer_set_with_cb(&jo1, "/new_key", json_object_new_string("new_value"), test_cb_print_msg, 0, NULL));
|
||||||
printf("PASSED - SET_WITH_CB - cb_handles_obj=0: callback was NOT triggered for object operation, default logic was used\n");
|
printf("PASSED - SET_WITH_CB - cb_handles_obj=0: callback was NOT triggered for object operation, default logic was used\n");
|
||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
|
|
||||||
// testing rejection logic callback
|
// testing rejection logic callback
|
||||||
jo1 = json_tokener_parse("{'data': {} }");
|
jo1 = json_tokener_parse("{'data': {} }");
|
||||||
assert(jo1 != NULL);
|
assert(jo1 != NULL);
|
||||||
|
|
||||||
assert(0 == json_pointer_set_with_cb(&jo1, "/data/accept", json_object_new_string("accepted_value"), test_cb_reject_logic, 1, NULL));
|
assert(0 == json_pointer_set_with_cb(&jo1, "/data/accept", json_object_new_string("accepted_value"), test_cb_reject_logic, 1, NULL));
|
||||||
printf("PASSED - SET_WITH_CB - Rejection callback approved an allowed key\n");
|
printf("PASSED - SET_WITH_CB - Rejection callback approved an allowed key\n");
|
||||||
|
|
||||||
assert(0 != json_pointer_set_with_cb(&jo1, "/data/reject", json_object_new_string("rejected_value"), test_cb_reject_logic, 1, NULL));
|
assert(0 != json_pointer_set_with_cb(&jo1, "/data/reject", (jo2 = json_object_new_string("rejected_value")), test_cb_reject_logic, 1, NULL));
|
||||||
printf("PASSED - SET_WITH_CB - Rejection callback rejected a forbidden key\n");
|
json_object_put(jo2);
|
||||||
|
printf("PASSED - SET_WITH_CB - Rejection callback rejected a forbidden key\n");
|
||||||
|
|
||||||
json_object_put(jo1);
|
json_object_put(jo1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
test_example_set_with_limit_index();
|
test_example_set_with_limit_index();
|
||||||
test_wrong_inputs_set_with_limit_index();
|
test_wrong_inputs_set_with_limit_index();
|
||||||
test_set_with_cb();
|
test_set_with_cb();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user