Register a wmem callback to free the glib hash tables used in SMB2 conversation

structs. Fixes the most egregious of the memory leaks (around 300KB) from
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9120

svn path=/trunk/; revision=51873
This commit is contained in:
Evan Huus 2013-09-09 17:51:30 +00:00
parent f74bd06ecf
commit 771668d630
1 changed files with 26 additions and 1 deletions

View File

@ -36,6 +36,7 @@
#include <epan/conversation.h>
#include <epan/tap.h>
#include <epan/emem.h>
#include <epan/wmem/wmem.h>
#include <epan/aftypes.h>
#include "packet-smb2.h"
@ -614,6 +615,24 @@ smb2_sesid_info_hash(gconstpointer k)
return hash;
}
/* Callback for destroying the glib hash tables associated with a conversation
* struct. */
static gboolean
smb2_conv_destroy(wmem_allocator_t *allocator _U_, wmem_cb_event_t event _U_,
void *user_data)
{
smb2_conv_info_t *conv = (smb2_conv_info_t *)user_data;
g_hash_table_destroy(conv->matched);
g_hash_table_destroy(conv->unmatched);
g_hash_table_destroy(conv->sesids);
g_hash_table_destroy(conv->files);
/* This conversation is gone, return FALSE to indicate we don't
* want to be called again for this conversation. */
return FALSE;
}
static void smb2_key_derivation(const guint8 *KI _U_, guint32 KI_len _U_,
const guint8 *Label _U_, guint32 Label_len _U_,
const guint8 *Context _U_, guint32 Context_len _U_,
@ -6799,7 +6818,7 @@ dissect_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolea
/* no smb2_into_t structure for this conversation yet,
* create it.
*/
si->conv = se_new(smb2_conv_info_t);
si->conv = wmem_new(wmem_file_scope(), smb2_conv_info_t);
/* qqq this leaks memory for now since we never free
the hashtables */
si->conv->matched = g_hash_table_new(smb2_saved_info_hash_matched,
@ -6810,6 +6829,12 @@ dissect_smb2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, gboolea
smb2_sesid_info_equal);
si->conv->files = g_hash_table_new(smb2_eo_files_hash,smb2_eo_files_equal);
/* Bit of a hack to avoid leaking the hash tables - register a
* callback to free them. Ideally wmem would implement a simple
* hash table so we wouldn't have to do this. */
wmem_register_callback(wmem_file_scope(), smb2_conv_destroy,
si->conv);
conversation_add_proto_data(conversation, proto_smb2, si->conv);
}