[libgdata] [core] Fix memory leaks



commit 59fa2910237997073f8aa5eea0a5e02bc7ebf4ec
Author: Philip Withnall <philip tecnocode co uk>
Date:   Fri Jan 22 23:59:58 2010 +0000

    [core] Fix memory leaks
    
    Fix a few memory leaks, including a fairly large one which would leak the
    entire XML parse tree for each GDataParsable.

 gdata/atom/gdata-link.c          |    1 +
 gdata/gd/gdata-gd-phone-number.c |    2 ++
 gdata/gdata-access-rule.c        |    1 +
 gdata/gdata-parsable.c           |   13 +++++++++----
 gdata/tests/memcheck             |    2 +-
 5 files changed, 14 insertions(+), 5 deletions(-)
---
diff --git a/gdata/atom/gdata-link.c b/gdata/atom/gdata-link.c
index 00a9c7e..7fa7ceb 100644
--- a/gdata/atom/gdata-link.c
+++ b/gdata/atom/gdata-link.c
@@ -310,6 +310,7 @@ pre_parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *root_node, gpointe
 		self->priv->length = -1;
 	else
 		self->priv->length = strtoul ((gchar*) length, NULL, 10);
+	xmlFree (length);
 
 	return TRUE;
 }
diff --git a/gdata/gd/gdata-gd-phone-number.c b/gdata/gd/gdata-gd-phone-number.c
index 4921d34..6fa1a5c 100644
--- a/gdata/gd/gdata-gd-phone-number.c
+++ b/gdata/gd/gdata-gd-phone-number.c
@@ -281,6 +281,8 @@ pre_parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *root_node, gpointe
 	priv->label = (gchar*) xmlGetProp (root_node, (xmlChar*) "label");
 	priv->is_primary = primary_bool;
 
+	xmlFree (number);
+
 	return TRUE;
 }
 
diff --git a/gdata/gdata-access-rule.c b/gdata/gdata-access-rule.c
index 28004c8..d5920d8 100644
--- a/gdata/gdata-access-rule.c
+++ b/gdata/gdata-access-rule.c
@@ -252,6 +252,7 @@ get_xml (GDataParsable *parsable, GString *xml_string)
 	/* Ensure we have the correct category/kind */
 	category = gdata_category_new ("http://schemas.google.com/acl/2007#accessRule";, "http://schemas.google.com/g/2005#kind";, NULL);
 	gdata_entry_add_category (GDATA_ENTRY (parsable), category);
+	g_object_unref (category);
 
 	/* So it's valid Atom, set the title if one doesn't already exist */
 	if (gdata_entry_get_title (GDATA_ENTRY (parsable)) == NULL)
diff --git a/gdata/gdata-parsable.c b/gdata/gdata-parsable.c
index 5ae5182..9b7e4de 100644
--- a/gdata/gdata-parsable.c
+++ b/gdata/gdata-parsable.c
@@ -106,9 +106,11 @@ real_parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer us
 
 	for (namespace = namespaces; *namespace != NULL; namespace++) {
 		if ((*namespace)->prefix != NULL) {
+			/* NOTE: These two g_strdup()s leak, but it's probably acceptable, given that it saves us
+			 * g_strdup()ing every other namespace we put in @extra_namespaces. */
 			g_hash_table_insert (parsable->priv->extra_namespaces,
-					     g_strdup ((gchar*) ((*namespace)->prefix)),
-					     g_strdup ((gchar*) ((*namespace)->href)));
+			                     g_strdup ((gchar*) ((*namespace)->prefix)),
+			                     g_strdup ((gchar*) ((*namespace)->href)));
 		}
 	}
 	xmlFree (namespaces);
@@ -147,6 +149,7 @@ _gdata_parsable_new_from_xml (GType parsable_type, const gchar *xml, gint length
 {
 	xmlDoc *doc;
 	xmlNode *node;
+	GDataParsable *parsable;
 	static gboolean libxml_initialised = FALSE;
 
 	g_return_val_if_fail (g_type_is_a (parsable_type, GDATA_TYPE_PARSABLE), NULL);
@@ -188,7 +191,10 @@ _gdata_parsable_new_from_xml (GType parsable_type, const gchar *xml, gint length
 		return NULL;
 	}
 
-	return _gdata_parsable_new_from_xml_node (parsable_type, doc, node, user_data, error);
+	parsable = _gdata_parsable_new_from_xml_node (parsable_type, doc, node, user_data, error);
+	xmlFreeDoc (doc);
+
+	return parsable;
 }
 
 GDataParsable *
@@ -212,7 +218,6 @@ _gdata_parsable_new_from_xml_node (GType parsable_type, xmlDoc *doc, xmlNode *no
 	/*if (xmlStrcmp (node->name, (xmlChar*) klass->element_name) != 0 ||
 	    (node->ns != NULL && xmlStrcmp (node->ns->prefix, (xmlChar*) klass->element_namespace) != 0)) {
 		* No <entry> element (required) *
-		xmlFreeDoc (doc);
 		gdata_parser_error_required_element_missing (klass->element_name, "root", error);
 		return NULL;
 	}*/
diff --git a/gdata/tests/memcheck b/gdata/tests/memcheck
index 0c36a1b..5459151 100755
--- a/gdata/tests/memcheck
+++ b/gdata/tests/memcheck
@@ -1,4 +1,4 @@
 #!/bin/sh
 
 G_SLICE=always-malloc libtool --mode=execute "valgrind --tool=memcheck --log-file=memcheck.`date +%s` --leak-check=full --leak-resolution=high \
-						--show-reachable=yes" ./calendar
+						--show-reachable=yes" ./general



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]