]> granicus.if.org Git - json-c/commitdiff
Issue #260: add a check to prevent trivial loops in the object tree, even though...
authorEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 21 Aug 2016 02:41:49 +0000 (22:41 -0400)
committerEric Haszlakiewicz <erh+git@nimenees.com>
Sun, 21 Aug 2016 02:42:59 +0000 (22:42 -0400)
json_object.c
tests/test1.c

index 5104be9e1ce035477d2902f178e1d2b8e79500fd..f657afe55c279da6dc8c2c570ca4e963bc07f289 100644 (file)
@@ -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 : 
                              lh_table_lookup_entry_w_hash(jso->o.c_object,
                                                           (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)
        {
                const void *const k = (opts & JSON_C_OBJECT_KEY_IS_CONSTANT) ?
index fee799cc0b63746fab8c51ff943b4dfb5e703faf..b093df7475ba9e76016e6993756278d763b04b66 100644 (file)
@@ -205,6 +205,12 @@ int main(int argc, char **argv)
        printf("my_array.to_string()=%s\n", json_object_to_json_string(my_array));
 
        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, "foo", json_object_new_string("bar"));
        json_object_object_add(my_object, "bool0", json_object_new_boolean(0));