9e93f2
From a09ea6bd74d6234be8456e7039403bc1c1d078bd Mon Sep 17 00:00:00 2001
9e93f2
From: Christophe Fergeau <cfergeau@redhat.com>
9e93f2
Date: Mon, 20 Jun 2016 12:05:48 +0200
9e93f2
Subject: [PATCH 1/4] xml-node: Use GString in rest_xml_node_print()
9e93f2
9e93f2
The current code is using xml = g_strconcat (xml, ...) which is causing
9e93f2
some leaks as g_strconcat returns a newly allocated string. Using
9e93f2
GString avoids this issue without constantly freeing the intermediate
9e93f2
strings.
9e93f2
9e93f2
This fixes multiple leaks like:
9e93f2
9e93f2
==16611== 18 bytes in 1 blocks are definitely lost in loss record 124 of 301
9e93f2
==16611==    at 0x4C2BBAD: malloc (vg_replace_malloc.c:299)
9e93f2
==16611==    by 0x5F5CE58: g_malloc (gmem.c:94)
9e93f2
==16611==    by 0x5F75B8E: g_strconcat (gstrfuncs.c:585)
9e93f2
==16611==    by 0x4E450CF: rest_xml_node_print (rest-xml-node.c:287)
9e93f2
==16611==    by 0x4E451DA: rest_xml_node_print (rest-xml-node.c:305)
9e93f2
==16611==    by 0x4E450F8: rest_xml_node_print (rest-xml-node.c:292)
9e93f2
==16611==    by 0x4009A0: main (xml.c:40)
9e93f2
---
9e93f2
 rest/rest-xml-node.c | 21 ++++++++++++---------
9e93f2
 1 file changed, 12 insertions(+), 9 deletions(-)
9e93f2
9e93f2
diff --git a/rest/rest-xml-node.c b/rest/rest-xml-node.c
9e93f2
index 57a942667f06..a8156dbbd432 100644
9e93f2
--- a/rest/rest-xml-node.c
9e93f2
+++ b/rest/rest-xml-node.c
9e93f2
@@ -283,38 +283,41 @@ rest_xml_node_print (RestXmlNode *node)
9e93f2
 {
9e93f2
   GHashTableIter iter;
9e93f2
   gpointer       key, value;
9e93f2
-  char          *xml = g_strconcat ("<", node->name, NULL);
9e93f2
+  GString        *xml = g_string_new (NULL);
9e93f2
   RestXmlNode   *n;
9e93f2
 
9e93f2
+  g_string_append (xml, "<");
9e93f2
+  g_string_append (xml, node->name);
9e93f2
+
9e93f2
   g_hash_table_iter_init (&iter, node->attrs);
9e93f2
   while (g_hash_table_iter_next (&iter, &key, &value))
9e93f2
-    xml = g_strconcat (xml, " ", key, "=\'", value, "\'", NULL);
9e93f2
+    g_string_append_printf (xml, " %s =\'%s\'", (char *)key, (char *)value);
9e93f2
 
9e93f2
-  xml = g_strconcat (xml, ">", NULL);
9e93f2
+  g_string_append (xml, ">");
9e93f2
 
9e93f2
   g_hash_table_iter_init (&iter, node->children);
9e93f2
   while (g_hash_table_iter_next (&iter, &key, &value))
9e93f2
     {
9e93f2
       char *child = rest_xml_node_print ((RestXmlNode *) value);
9e93f2
 
9e93f2
-      xml = g_strconcat (xml, child, NULL);
9e93f2
+      g_string_append (xml, child);
9e93f2
       g_free (child);
9e93f2
     }
9e93f2
 
9e93f2
   if (node->content)
9e93f2
-    xml = g_strconcat (xml, node->content, "</", node->name, ">", NULL);
9e93f2
-  else
9e93f2
-    xml = g_strconcat (xml, "</", node->name, ">", NULL);
9e93f2
+    g_string_append (xml, node->content);
9e93f2
+
9e93f2
+  g_string_append_printf (xml, "</%s>", node->name);
9e93f2
 
9e93f2
   for (n = node->next; n; n = n->next)
9e93f2
     {
9e93f2
       char *sibling = rest_xml_node_print (n);
9e93f2
 
9e93f2
-      xml = g_strconcat (xml, sibling, NULL);
9e93f2
+      g_string_append (xml, sibling);
9e93f2
       g_free (sibling);
9e93f2
     }
9e93f2
 
9e93f2
-  return xml;
9e93f2
+  return g_string_free (xml, FALSE);
9e93f2
 }
9e93f2
 
9e93f2
 /**
9e93f2
-- 
9e93f2
2.14.2
9e93f2
9e93f2
9e93f2
From a34d02947c4f102e6d16b9d328941a4b2946c8e8 Mon Sep 17 00:00:00 2001
9e93f2
From: Debarshi Ray <debarshir@gnome.org>
9e93f2
Date: Fri, 13 Oct 2017 18:53:39 +0200
9e93f2
Subject: [PATCH 2/4] xml-node: Remove stray blank space
9e93f2
9e93f2
This had broken tests/xml.c.
9e93f2
9e93f2
Fallout from 61a7b231bd8b9d1b8d02dca120389e79d38b428d
9e93f2
9e93f2
https://bugzilla.gnome.org/show_bug.cgi?id=788960
9e93f2
---
9e93f2
 rest/rest-xml-node.c | 2 +-
9e93f2
 1 file changed, 1 insertion(+), 1 deletion(-)
9e93f2
9e93f2
diff --git a/rest/rest-xml-node.c b/rest/rest-xml-node.c
9e93f2
index a8156dbbd432..d3a7c995affd 100644
9e93f2
--- a/rest/rest-xml-node.c
9e93f2
+++ b/rest/rest-xml-node.c
9e93f2
@@ -291,7 +291,7 @@ rest_xml_node_print (RestXmlNode *node)
9e93f2
 
9e93f2
   g_hash_table_iter_init (&iter, node->attrs);
9e93f2
   while (g_hash_table_iter_next (&iter, &key, &value))
9e93f2
-    g_string_append_printf (xml, " %s =\'%s\'", (char *)key, (char *)value);
9e93f2
+    g_string_append_printf (xml, " %s=\'%s\'", (char *)key, (char *)value);
9e93f2
 
9e93f2
   g_string_append (xml, ">");
9e93f2
 
9e93f2
-- 
9e93f2
2.14.2
9e93f2
9e93f2
9e93f2
From f184db2bff0618b99c4de3316082fe80439f124c Mon Sep 17 00:00:00 2001
9e93f2
From: Debarshi Ray <debarshir@gnome.org>
9e93f2
Date: Fri, 13 Oct 2017 19:14:16 +0200
9e93f2
Subject: [PATCH 3/4] xml-node: Define the order in which attributes & children
9e93f2
 are printed
9e93f2
9e93f2
The order in which GHashTable returns its key-value pairs is undefined.
9e93f2
Therefore the output of rest_xml_node_print can change based on the
9e93f2
GHashTable implementation. While not strictly necessary, it would be
9e93f2
nice to avoid that. Having a stable order, even if it is not
9e93f2
documented and depends on the current RestXmlNode code, is handy for
9e93f2
testing.
9e93f2
9e93f2
This was the main reason behind the tests/xml.c breakage.
9e93f2
9e93f2
https://bugzilla.gnome.org/show_bug.cgi?id=788960
9e93f2
---
9e93f2
 rest/rest-xml-node.c | 23 ++++++++++++++++++++++-
9e93f2
 1 file changed, 22 insertions(+), 1 deletion(-)
9e93f2
9e93f2
diff --git a/rest/rest-xml-node.c b/rest/rest-xml-node.c
9e93f2
index d3a7c995affd..973ebcf6c3fa 100644
9e93f2
--- a/rest/rest-xml-node.c
9e93f2
+++ b/rest/rest-xml-node.c
9e93f2
@@ -283,6 +283,9 @@ rest_xml_node_print (RestXmlNode *node)
9e93f2
 {
9e93f2
   GHashTableIter iter;
9e93f2
   gpointer       key, value;
9e93f2
+  GList          *attrs = NULL;
9e93f2
+  GList          *children = NULL;
9e93f2
+  GList          *l;
9e93f2
   GString        *xml = g_string_new (NULL);
9e93f2
   RestXmlNode   *n;
9e93f2
 
9e93f2
@@ -291,13 +294,29 @@ rest_xml_node_print (RestXmlNode *node)
9e93f2
 
9e93f2
   g_hash_table_iter_init (&iter, node->attrs);
9e93f2
   while (g_hash_table_iter_next (&iter, &key, &value))
9e93f2
-    g_string_append_printf (xml, " %s=\'%s\'", (char *)key, (char *)value);
9e93f2
+    {
9e93f2
+      char *attr = g_strdup_printf ("%s=\'%s\'", (char *)key, (char *)value);
9e93f2
+      attrs = g_list_prepend (attrs, attr);
9e93f2
+    }
9e93f2
+
9e93f2
+  attrs = g_list_sort (attrs, (GCompareFunc) g_strcmp0);
9e93f2
+  for (l = attrs; l; l = l->next)
9e93f2
+    {
9e93f2
+      const char *attr = (const char *) l->data;
9e93f2
+      g_string_append_printf (xml, " %s", attr);
9e93f2
+    }
9e93f2
 
9e93f2
   g_string_append (xml, ">");
9e93f2
 
9e93f2
   g_hash_table_iter_init (&iter, node->children);
9e93f2
   while (g_hash_table_iter_next (&iter, &key, &value))
9e93f2
+    children = g_list_prepend (children, key);
9e93f2
+
9e93f2
+  children = g_list_sort (children, (GCompareFunc) g_strcmp0);
9e93f2
+  for (l = children; l; l = l->next)
9e93f2
     {
9e93f2
+      const char *name = (const char *) l->data;
9e93f2
+      RestXmlNode *value = (RestXmlNode *) g_hash_table_lookup (node->children, name);
9e93f2
       char *child = rest_xml_node_print ((RestXmlNode *) value);
9e93f2
 
9e93f2
       g_string_append (xml, child);
9e93f2
@@ -317,6 +336,8 @@ rest_xml_node_print (RestXmlNode *node)
9e93f2
       g_free (sibling);
9e93f2
     }
9e93f2
 
9e93f2
+  g_list_free_full (attrs, g_free);
9e93f2
+  g_list_free (children);
9e93f2
   return g_string_free (xml, FALSE);
9e93f2
 }
9e93f2
 
9e93f2
-- 
9e93f2
2.14.2
9e93f2
9e93f2
9e93f2
From e5ee6ef751ee5a38d7b9fadcd631cf6ecec7b240 Mon Sep 17 00:00:00 2001
9e93f2
From: Debarshi Ray <debarshir@gnome.org>
9e93f2
Date: Fri, 13 Oct 2017 19:16:55 +0200
9e93f2
Subject: [PATCH 4/4] tests: Re-enable the XML test
9e93f2
9e93f2
This reverts commit 2d1dbfe7073b1e153ff881426b40a9a517fb796b
9e93f2
9e93f2
https://bugzilla.gnome.org/show_bug.cgi?id=788960
9e93f2
---
9e93f2
 tests/Makefile.am | 2 --
9e93f2
 1 file changed, 2 deletions(-)
9e93f2
9e93f2
diff --git a/tests/Makefile.am b/tests/Makefile.am
9e93f2
index 5d77f9cf5445..5ffdd4634e9a 100644
9e93f2
--- a/tests/Makefile.am
9e93f2
+++ b/tests/Makefile.am
9e93f2
@@ -1,6 +1,4 @@
9e93f2
 TESTS = proxy proxy-continuous threaded oauth oauth-async oauth2 flickr lastfm xml custom-serialize
9e93f2
-# TODO: fix this test case
9e93f2
-XFAIL_TESTS = xml
9e93f2
 
9e93f2
 AM_CPPFLAGS = $(SOUP_CFLAGS) -I$(top_srcdir) $(GCOV_CFLAGS)
9e93f2
 AM_LDFLAGS = $(SOUP_LIBS) $(GCOV_LDFLAGS) \
9e93f2
-- 
9e93f2
2.14.2
9e93f2