aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-xml.c
diff options
context:
space:
mode:
authorLuis Ontanon <luis.ontanon@gmail.com>2005-09-22 16:41:53 +0000
committerLuis Ontanon <luis.ontanon@gmail.com>2005-09-22 16:41:53 +0000
commit88dd585d231e8b48d1d18d48f16db7f5116026d8 (patch)
tree874f05f4e0c8220d4faa549342663dd3d6d27c74 /epan/dissectors/packet-xml.c
parent81a2feddabc6ef32a06276bbbb5c1fe2ba95d161 (diff)
in register_dtd() do not leak the elements hash
svn path=/trunk/; revision=15959
Diffstat (limited to 'epan/dissectors/packet-xml.c')
-rw-r--r--epan/dissectors/packet-xml.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/epan/dissectors/packet-xml.c b/epan/dissectors/packet-xml.c
index 4dab5829fe..f5cfa3ca0f 100644
--- a/epan/dissectors/packet-xml.c
+++ b/epan/dissectors/packet-xml.c
@@ -773,6 +773,25 @@ static xml_ns_t* make_xml_hier(gchar* elem_name,
return new;
}
+static gboolean free_both(gpointer k, gpointer v, gpointer p _U_) {
+ g_free(k);
+ g_free(v);
+ return TRUE;
+}
+
+static gboolean free_elements(gpointer k _U_, gpointer v, gpointer p _U_) {
+ xml_ns_t* e = v;
+
+ g_free(e->name);
+ g_hash_table_foreach_remove(e->attributes,free_both,NULL);
+ g_hash_table_destroy(e->attributes);
+ g_hash_table_destroy(e->elements);
+ g_ptr_array_free(e->element_names,TRUE);
+ g_free(e);
+
+ return TRUE;
+}
+
static void register_dtd(dtd_build_data_t* dtd_data, GString* errors) {
GHashTable* elements = g_hash_table_new(g_str_hash,g_str_equal);
gchar* root_name = NULL;
@@ -952,6 +971,8 @@ next_attribute:
g_hash_table_insert(xml_ns.elements,root_element->name,root_element);
+ g_hash_table_foreach_remove(elements,free_elements,NULL);
+
destroy_dtd_data(dtd_data);
}