diff options
author | Luis Ontanon <luis.ontanon@gmail.com> | 2005-09-22 16:41:53 +0000 |
---|---|---|
committer | Luis Ontanon <luis.ontanon@gmail.com> | 2005-09-22 16:41:53 +0000 |
commit | 88dd585d231e8b48d1d18d48f16db7f5116026d8 (patch) | |
tree | 874f05f4e0c8220d4faa549342663dd3d6d27c74 /epan/dissectors/packet-xml.c | |
parent | 81a2feddabc6ef32a06276bbbb5c1fe2ba95d161 (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.c | 21 |
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); } |