mirror of
https://github.com/json-c/json-c.git
synced 2026-04-09 23:39:06 +08:00
Issue #260: add a check to prevent trivial loops in the object tree, even though it is up to the callers to avoid doing so in more complex cases.
This commit is contained in:
@@ -459,6 +459,12 @@ int json_object_object_add_ex(struct json_object* jso,
|
|||||||
existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ? NULL :
|
existing_entry = (opts & JSON_C_OBJECT_ADD_KEY_IS_NEW) ? NULL :
|
||||||
lh_table_lookup_entry_w_hash(jso->o.c_object,
|
lh_table_lookup_entry_w_hash(jso->o.c_object,
|
||||||
(const void *)key, hash);
|
(const void *)key, hash);
|
||||||
|
|
||||||
|
// The caller must avoid creating loops in the object tree, but do a
|
||||||
|
// quick check anyway to make sure we're not creating a trivial loop.
|
||||||
|
if (jso == val)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (!existing_entry)
|
if (!existing_entry)
|
||||||
{
|
{
|
||||||
const void *const k = (opts & JSON_C_OBJECT_KEY_IS_CONSTANT) ?
|
const void *const k = (opts & JSON_C_OBJECT_KEY_IS_CONSTANT) ?
|
||||||
|
|||||||
@@ -205,6 +205,12 @@ int main(int argc, char **argv)
|
|||||||
printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
|
printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
|
||||||
|
|
||||||
my_object = json_object_new_object();
|
my_object = json_object_new_object();
|
||||||
|
int rc = json_object_object_add(my_object, "abc", my_object);
|
||||||
|
if (rc != -1)
|
||||||
|
{
|
||||||
|
printf("ERROR: able to successfully add object to itself!\n");
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
json_object_object_add(my_object, "abc", json_object_new_int(12));
|
json_object_object_add(my_object, "abc", json_object_new_int(12));
|
||||||
json_object_object_add(my_object, "foo", json_object_new_string("bar"));
|
json_object_object_add(my_object, "foo", json_object_new_string("bar"));
|
||||||
json_object_object_add(my_object, "bool0", json_object_new_boolean(0));
|
json_object_object_add(my_object, "bool0", json_object_new_boolean(0));
|
||||||
|
|||||||
Reference in New Issue
Block a user