[libgdata] [core] Fix memory leaks
- From: Philip Withnall <pwithnall src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgdata] [core] Fix memory leaks
- Date: Sat, 23 Jan 2010 00:00:37 +0000 (UTC)
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]