[libgdata] core: Correctly track JSON reader state when cloning nodes



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]