aboutsummaryrefslogtreecommitdiffstats
path: root/wiretap
diff options
context:
space:
mode:
authorDario Lombardo <lomato@gmail.com>2016-04-19 12:23:53 +0200
committerMichael Mann <mmann78@netscape.net>2016-04-19 22:59:56 +0000
commitc33274dafad53f5f9126708065d2f7f486aa0e54 (patch)
tree4e3f1ac891d0a8b5e61b8d78c627726affb44f3a /wiretap
parent45a4ec8ae8c1c25d69c5cac1d624658aed64be2e (diff)
wtap: fix leak in optionblock management.
Found by valgrind: ==14298== at 0x4C2CE8E: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==14298== by 0xA66C6AE: g_realloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0) ==14298== by 0xA63BB32: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0) ==14298== by 0xA63BEB7: g_array_append_vals (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4002.0) ==14298== by 0xA193252: wtap_optionblock_add_option (wtap_opttypes.c:352) ==14298== by 0xA19361C: shb_create (wtap_opttypes.c:607) ==14298== by 0xA192F96: wtap_optionblock_create (wtap_opttypes.c:126) ==14298== by 0xA168784: wtap_open_offline (file_access.c:824) ==14298== by 0x11D47C: cf_open (tshark.c:4194) ==14298== by 0x117852: main (tshark.c:2183) et al. Change-Id: Ic16595ed3c12b9ed6c2813852ceb594c29ece929 Reviewed-on: https://code.wireshark.org/review/15004 Petri-Dish: Dario Lombardo <lomato@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Evan Huus <eapache@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'wiretap')
-rw-r--r--wiretap/wtap_opttypes.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/wiretap/wtap_opttypes.c b/wiretap/wtap_opttypes.c
index 94ff7682fb..4ecc9bd7a0 100644
--- a/wiretap/wtap_opttypes.c
+++ b/wiretap/wtap_opttypes.c
@@ -155,6 +155,7 @@ static void wtap_optionblock_free_options(wtap_optionblock_t block)
void wtap_optionblock_free(wtap_optionblock_t block)
{
+ unsigned i;
if (block != NULL)
{
if (block->info->free_mand != NULL)
@@ -162,10 +163,12 @@ void wtap_optionblock_free(wtap_optionblock_t block)
g_free(block->mandatory_data);
wtap_optionblock_free_options(block);
+ for (i = 0; i < block->option_infos->len; i++)
+ g_free(g_array_index(block->option_infos, wtap_optblock_internal_t*, i));
if (block->option_infos != NULL)
- g_array_free(block->option_infos, FALSE);
+ g_array_free(block->option_infos, TRUE);
if (block->option_values != NULL)
- g_array_free(block->option_values, FALSE);
+ g_array_free(block->option_values, TRUE);
g_free(block);
}
}