[BZ#661665] json_object_get_*_element cannot be used without json_object_has_member
Submitted by Daniil Ivanov <<dan..@..com>>
Assigned to json-glib-maint@gnome.bugs
Link to original bug (#661665)
Description
Created attachment 198933 Patch to address the issue
Let's consider this code:
JsonParser *parser = json_parser_new (); json_parser_load_from_data (parser, "{"member1":"value1","member2":"value2"}", -1, NULL); JsonNode *node = json_parser_get_root (parser); JsonObject *obj = json_node_get_object (node);
g_print ("%f\n", json_array_get_string_element (obj, "member3"));
g_object_unref (parser);
When compiled without debug flag, it will crash as json_node_get_* will skip g_return_* and dereference node without any checks in http://git.gnome.org/browse/json-glib/tree/json-glib/json-node.c#n572 and further http://git.gnome.org/browse/json-glib/tree/json-glib/json-node.c#n775
Practically it means it's any use for getter must be preceded by has_member check: if (json_object_has_member (obj, "member3")) g_print ("%f\n", json_array_get_string_element (obj, "member3"));
This is an overkill and leads to unreadable code, performance drop, but can be easily avoided, if checking for node being non-NULL in json_node_get_node_type. See patch for details.