[libgdata] core: Correctly track JSON reader state when cloning nodes
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata] core: Correctly track JSON reader state when cloning nodes
- Date: Mon, 13 Apr 2015 23:01:36 +0000 (UTC)
commit c8c56eec911d58e167d3772dbc10f4e4242c10c0
Author: Philip Withnall <philip tecnocode co uk>
Date: Mon Apr 13 23:57:55 2015 +0100
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.
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 85ddaa6..e1822ec 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) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]