aboutsummaryrefslogtreecommitdiffstats
path: root/epan/reassemble.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2013-03-23 02:40:37 +0000
committerGuy Harris <guy@alum.mit.edu>2013-03-23 02:40:37 +0000
commiteee846b9c604bc66d642a41fe3c30f45c30bb61c (patch)
tree770db4044051c5aa7dec2eae95fe91687c802203 /epan/reassemble.c
parenta2414d8909088ddb40c907886e725993e6baecb5 (diff)
Make reassembly_table_destroy() clear the function pointers and empty
and destroy the reassembled table. svn path=/trunk/; revision=48492
Diffstat (limited to 'epan/reassemble.c')
-rw-r--r--epan/reassemble.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/epan/reassemble.c b/epan/reassemble.c
index 3e29947506..9a6946f0c4 100644
--- a/epan/reassemble.c
+++ b/epan/reassemble.c
@@ -464,6 +464,12 @@ reassembly_table_init(reassembly_table *table,
void
reassembly_table_destroy(reassembly_table *table)
{
+ /*
+ * Clear the function pointers.
+ */
+ table->temporary_key_func = NULL;
+ table->persistent_key_func = NULL;
+ table->free_temporary_key_func = NULL;
if (table->fragment_table != NULL) {
/*
* The fragment hash table exists.
@@ -477,9 +483,35 @@ reassembly_table_destroy(reassembly_table *table)
g_hash_table_foreach_remove(table->fragment_table,
free_all_fragments, NULL);
+ /*
+ * Now destroy the hash table.
+ */
g_hash_table_destroy(table->fragment_table);
table->fragment_table = NULL;
}
+ if (table->reassembled_table != NULL) {
+ GPtrArray *allocated_fragments;
+
+ /*
+ * The reassembled-packet hash table exists.
+ *
+ * Remove all entries and free reassembled packet
+ * data and key for each entry.
+ */
+
+ allocated_fragments = g_ptr_array_new();
+ g_hash_table_foreach_remove(table->reassembled_table,
+ free_all_reassembled_fragments, allocated_fragments);
+
+ g_ptr_array_foreach(allocated_fragments, free_fragments, NULL);
+ g_ptr_array_free(allocated_fragments, TRUE);
+
+ /*
+ * Now destroy the hash table.
+ */
+ g_hash_table_destroy(table->reassembled_table);
+ table->reassembled_table = NULL;
+ }
}
/*