From 1d6e4189a9247fc79257d73e4e75f93514af3c49 Mon Sep 17 00:00:00 2001 From: Bill Meier Date: Wed, 19 Mar 2008 21:09:31 +0000 Subject: [PATCH] Windows: use free() only if vc6 (as suggested by Peter Johansson); Thus standard Windows Wireshark release will not have memory leak here. Assumption: Wireshark Windows libsmi.dll built with vc6. This solution is temporary. svn path=/trunk/; revision=24702 --- epan/oids.c | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/epan/oids.c b/epan/oids.c index 5251faa880..ce78cefc50 100644 --- a/epan/oids.c +++ b/epan/oids.c @@ -180,6 +180,28 @@ extern void oid_add_from_encoded(const char* name, const guint8 *oid, gint oid_l } #ifdef HAVE_LIBSMI +/* de-allocate storage mallocated by libsmi */ +/* */ +/* XXX: On Windows we can use free() only if the Windows libsmi.dll */ +/* being used is linked with the same CRTL as wireshark. */ +/* As a temporary hack we'll assume on Windows that the Wireshark */ +/* build of libsmi.dll was done with VC6/msvcrt.dll (as is */ +/* currently the case). If wireshark is being built with */ +/* vc6 (which is also currently the case for the standard */ +/* wireshark release). we can use free(). */ +/* If vc6 is not being used here, then we'll just have to live */ +/* with a memory leak for now. */ +/* Note: A permanent fix would probably be for libsmi to include */ +/* its' existing smiFree function as part of the libsmi API so */ +/* wireshark can call it to free storage mallocated by libsmi. */ + +static void smi_free(void *ptr) { +#if !defined _WIN32 || (_MSC_VER == 1200) + free(ptr); +#endif +} + + typedef struct smi_module_t { char* name; } smi_module_t; @@ -291,16 +313,12 @@ const oid_value_type_t* get_typedata(SmiType* smiType) { for (t = types; t->type ; t++ ) { char* name = smiRenderType(sT, SMI_RENDER_NAME); if (name && t->name && g_str_equal(name, t->name )) { -#ifndef WIN32 - free (name); -#endif + smi_free(name); return t->type; } -#ifndef WIN32 if (name) { - free (name); + smi_free (name); } -#endif } } while(( sT = smiGetParentType(sT) )); @@ -388,10 +406,8 @@ static inline oid_kind_t smikind(SmiNode* sN, oid_key_t** key_p) { oid1 = smiRenderOID(sN->oidlen, sN->oid, SMI_RENDER_QUALIFIED); oid2 = smiRenderOID(elNode->oidlen, elNode->oid, SMI_RENDER_NAME); k->name = g_strdup_printf("%s.%s", oid1, oid2); -#ifndef WIN32 - free (oid1); - free (oid2); -#endif + smi_free (oid1); + smi_free (oid2); k->hfid = -2; k->ft_type = typedata ? typedata->ft_type : FT_BYTES; @@ -581,9 +597,7 @@ void register_mibs(void) { key, smiNode->oidlen, smiNode->oid); -#ifndef WIN32 - free (oid); -#endif + smi_free (oid); D(4,("\t\tNode: kind=%d oid=%s name=%s ", oid_data->kind, oid_subid2string(smiNode->oid, smiNode->oidlen), oid_data->name )); @@ -597,7 +611,7 @@ void register_mibs(void) { typedata->display, NULL, 0, -#ifndef WIN32 +#if !defined _WIN32 || (_MSC_VER == 1200) smiRenderOID(smiNode->oidlen, smiNode->oid, SMI_RENDER_ALL), #else g_strdup (smiRenderOID(smiNode->oidlen, smiNode->oid, SMI_RENDER_ALL)), @@ -619,7 +633,7 @@ void register_mibs(void) { hf.hfinfo.strings = VALS(vals->data); g_array_free(vals,FALSE); } -#if 0 /* packet-snmp does not hanldle bits yet */ +#if 0 /* packet-snmp does not handle bits yet */ } else if (smiType->basetype == SMI_BASETYPE_BITS && ( smiEnum = smiGetFirstNamedNumber(smiType) )) { guint n = 0; oid_bits_info_t* bits = g_malloc(sizeof(oid_bits_info_t)); @@ -1049,7 +1063,7 @@ oid_get_default_mib_path(void) { guint i; path_str = g_string_new(""); -#ifdef WIN32 +#ifdef _WIN32 #define PATH_SEPARATOR ";" path = get_datafile_path("snmp\\mibs"); g_string_sprintfa(path_str, "%s;", path);