summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Withnall <philip@tecnocode.co.uk>2015-04-13 23:57:55 +0100
committerPhilip Withnall <philip@tecnocode.co.uk>2015-04-14 00:00:25 +0100
commitc8c56eec911d58e167d3772dbc10f4e4242c10c0 (patch)
treec92c044268372cc494d2814174eb064887cf0960
parent94e5b8355ee3eda717c1a5e8d391478dd99a851a (diff)
downloadlibgdata-c8c56eec911d58e167d3772dbc10f4e4242c10c0.tar.gz
core: Correctly track JSON reader state when cloning nodes
It is not safe to call json_reader_get_member_name() after recursing the parser state, so we have to copy the list of member names before iterating.
-rw-r--r--gdata/gdata-parsable.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/gdata/gdata-parsable.c b/gdata/gdata-parsable.c
index 85ddaa64..e1822ec1 100644
--- a/gdata/gdata-parsable.c
+++ b/gdata/gdata-parsable.c
@@ -209,17 +209,20 @@ _json_reader_dup_current_node (JsonReader *reader)
}
} else if (json_reader_is_object (reader) == TRUE) {
/* Object nodes require deep copies. */
- gint i, members;
+ gint i;
+ gchar **members;
JsonObject *obj;
obj = json_object_new ();
- for (i = 0, members = json_reader_count_members (reader); i < members; i++) {
- json_reader_read_element (reader, i);
- json_object_set_member (obj, json_reader_get_member_name (reader), _json_reader_dup_current_node (reader));
- json_reader_end_element (reader);
+ for (i = 0, members = json_reader_list_members (reader); members[i] != NULL; i++) {
+ json_reader_read_member (reader, members[i]);
+ json_object_set_member (obj, members[i], _json_reader_dup_current_node (reader));
+ json_reader_end_member (reader);
}
+ g_strfreev (members);
+
value = json_node_new (JSON_NODE_OBJECT);
json_node_take_object (value, obj);
} else if (json_reader_is_array (reader) == TRUE) {