aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-diameter.c
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2016-08-28 22:19:29 +0200
committerPeter Wu <peter@lekensteyn.nl>2016-08-29 22:08:50 +0000
commita04b6fcb3db901734ed948134c973996786be8b7 (patch)
tree26e574116c07f1301634feefe9078adf100ffbb7 /epan/dissectors/packet-diameter.c
parent14312835c63a3e2ec9d311ed1ffee5285141f4f9 (diff)
diameter: fix 400kb leaked memory on exit
Before: SUMMARY: AddressSanitizer: 399684 byte(s) leaked in 17208 allocation(s). After addressing to-do by calling ddict_free: SUMMARY: AddressSanitizer: 3024 byte(s) leaked in 256 allocation(s). After fixing all remaining leaks cases in the flex file for diameter: SUMMARY: AddressSanitizer: 735 byte(s) leaked in 58 allocation(s). Not bad huh :-) Ping-Bug: 12790 Change-Id: I0c730ad77ae15c69390bc6cf0a3a985395a64771 Reviewed-on: https://code.wireshark.org/review/17364 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net> Reviewed-by: Jeff Morriss <jeff.morriss.ws@gmail.com> Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Diffstat (limited to 'epan/dissectors/packet-diameter.c')
-rw-r--r--epan/dissectors/packet-diameter.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c
index ab7bbd3093..ad021cbe75 100644
--- a/epan/dissectors/packet-diameter.c
+++ b/epan/dissectors/packet-diameter.c
@@ -680,7 +680,7 @@ dissect_diameter_avp(diam_ctx_t *c, tvbuff_t *tvb, int offset, diam_sub_dis_t *d
wmem_array_sort(vendor->vs_avps, compare_avps);
vendor->vs_avps_ext = value_string_ext_new(VND_AVP_VS(vendor),
VND_AVP_VS_LEN(vendor)+1,
- g_strdup_printf("diameter_vendor_%s",
+ wmem_strdup_printf(wmem_epan_scope(), "diameter_vendor_%s",
val_to_str_ext_const(vendorid,
&sminmpec_values_ext,
"Unknown")));
@@ -1838,6 +1838,14 @@ strcase_equal(gconstpointer ka, gconstpointer kb)
return g_ascii_strcasecmp(a,b) == 0;
}
+static gboolean
+ddict_cleanup_cb(wmem_allocator_t* allocator _U_, wmem_cb_event_t event _U_, void *user_data)
+{
+ ddict_t *d = (ddict_t *)user_data;
+ ddict_free(d);
+ return FALSE;
+}
+
/* Note: Dynamic "value string arrays" (e.g., vs_cmds, vs_avps, ...) are constructed using */
/* "zero-terminated" GArrays so that they will have the same form as standard */
@@ -1896,7 +1904,6 @@ dictionary_load(void)
/* load the dictionary */
dir = wmem_strdup_printf(NULL, "%s" G_DIR_SEPARATOR_S "diameter" G_DIR_SEPARATOR_S, get_datafile_dir());
- /* XXX We don't call ddict_free anywhere. */
d = ddict_scan(dir,"dictionary.xml",do_debug_parser);
wmem_free(NULL, dir);
if (d == NULL) {
@@ -1904,6 +1911,7 @@ dictionary_load(void)
g_array_free(vnd_shrt_arr, TRUE);
return 0;
}
+ wmem_register_callback(wmem_epan_scope(), ddict_cleanup_cb, d);
if (do_dump_dict) ddict_print(stdout, d);