diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2015-04-13 23:57:55 +0100 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2015-04-14 00:00:25 +0100 |
commit | c8c56eec911d58e167d3772dbc10f4e4242c10c0 (patch) | |
tree | c92c044268372cc494d2814174eb064887cf0960 | |
parent | 94e5b8355ee3eda717c1a5e8d391478dd99a851a (diff) | |
download | libgdata-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.c | 13 |
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) { |