aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-rlc.c
diff options
context:
space:
mode:
authorwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>2010-02-16 20:44:39 +0000
committerwmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7>2010-02-16 20:44:39 +0000
commit1fc42a7300d7cc3c9824ea8a53ed954c5483a6e2 (patch)
treedf21b71b8674ddd278e5f9ff4e6cad3933dfdcc4 /epan/dissectors/packet-rlc.c
parent52887eee61bd8d2166efc2ab9f417170fa00eeb6 (diff)
Fix a (small) memory leak.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@31899 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-rlc.c')
-rw-r--r--epan/dissectors/packet-rlc.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/epan/dissectors/packet-rlc.c b/epan/dissectors/packet-rlc.c
index 555ec35f6b..c276cecbb5 100644
--- a/epan/dissectors/packet-rlc.c
+++ b/epan/dissectors/packet-rlc.c
@@ -153,8 +153,8 @@ static const value_string rlc_sufi_vals[] = {
/* reassembly related data */
static GHashTable *fragment_table = NULL; /* maps rlc_channel -> fragmented sdu */
-static GHashTable *reassembled_table = NULL; /* maps fragment -> complete sdu */
-static GHashTable *sequence_table = NULL; /* channel -> seq */
+static GHashTable *reassembled_table = NULL; /* maps fragment -> complete sdu */
+static GHashTable *sequence_table = NULL; /* channel -> seq */
/* identify an RLC channel, using one of two options:
* - via Radio Bearer ID and U-RNTI
@@ -405,6 +405,18 @@ static gboolean free_table_entry(gpointer key _U_,
return TRUE;
}
+/* "Value destroy" function called each time an entry is removed
+ * from the sequence_table hash.
+ * It frees the GList pointed to by the entry.
+ */
+static void free_sequence_table_entry_data(struct rlc_seqlist *list)
+{
+ if (list->list != NULL) {
+ g_list_free(list->list);
+ list->list = NULL; /* for good measure */
+ }
+}
+
static void fragment_table_init(void)
{
if (fragment_table) {
@@ -416,6 +428,7 @@ static void fragment_table_init(void)
g_hash_table_destroy(reassembled_table);
}
if (sequence_table) {
+ /* Note: "value destroy" function wil be called for each removed hash table entry */
g_hash_table_foreach_remove(sequence_table, free_table_entry, NULL);
g_hash_table_destroy(sequence_table);
}
@@ -423,7 +436,8 @@ static void fragment_table_init(void)
rlc_channel_delete, rlc_sdu_frags_delete);
reassembled_table = g_hash_table_new_full(rlc_frag_hash, rlc_frag_equal,
rlc_frag_delete, rlc_sdu_frags_delete);
- sequence_table = g_hash_table_new(rlc_channel_hash, rlc_channel_equal);
+ sequence_table = g_hash_table_new_full(rlc_channel_hash, rlc_channel_equal,
+ NULL, free_sequence_table_entry_data);
}
/* add the list of fragments for this sdu to 'tree' */