diff options
author | wmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7> | 2010-02-16 20:44:39 +0000 |
---|---|---|
committer | wmeier <wmeier@f5534014-38df-0310-8fa8-9805f1628bb7> | 2010-02-16 20:44:39 +0000 |
commit | 1fc42a7300d7cc3c9824ea8a53ed954c5483a6e2 (patch) | |
tree | df21b71b8674ddd278e5f9ff4e6cad3933dfdcc4 /epan/dissectors/packet-rlc.c | |
parent | 52887eee61bd8d2166efc2ab9f417170fa00eeb6 (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.c | 20 |
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' */ |