From 6d79055ba651c6f1e45b22960c5fd34c75c95133 Mon Sep 17 00:00:00 2001 From: Dario Lombardo Date: Wed, 8 Feb 2017 14:25:57 +0100 Subject: wsutil: remove leaks from filesystem and plugins code. Change-Id: Iac2805c0130bd2ba6cdb3c9dd997050274d58d99 Reviewed-on: https://code.wireshark.org/review/20020 Reviewed-by: Michael Mann --- wsutil/filesystem.c | 10 ++++++++++ wsutil/filesystem.h | 5 +++++ wsutil/plugins.c | 29 ++++++++++++++++++++++++++++- wsutil/plugins.h | 1 + 4 files changed, 44 insertions(+), 1 deletion(-) (limited to 'wsutil') diff --git a/wsutil/filesystem.c b/wsutil/filesystem.c index 7ea4776a91..f820ef1df0 100644 --- a/wsutil/filesystem.c +++ b/wsutil/filesystem.c @@ -2191,6 +2191,16 @@ data_file_url(const gchar *filename) return uri; } +void +free_progdirs(void) +{ + g_free(progfile_dir); + g_free(plugin_dir); +#ifdef HAVE_EXTCAP + g_free(extcap_dir); +#endif +} + /* * Editor modelines * diff --git a/wsutil/filesystem.h b/wsutil/filesystem.h index a45367a69b..ea467c49ee 100644 --- a/wsutil/filesystem.h +++ b/wsutil/filesystem.h @@ -304,6 +304,11 @@ WS_DLL_PUBLIC gboolean copy_file_binary_mode(const char *from_filename, */ WS_DLL_PUBLIC gchar* data_file_url(const gchar *filename); +/* + * Free the internal structtures + */ +WS_DLL_PUBLIC void free_progdirs(void); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/wsutil/plugins.c b/wsutil/plugins.c index 1f637c552b..2e8b7dcfe8 100644 --- a/wsutil/plugins.c +++ b/wsutil/plugins.c @@ -156,6 +156,10 @@ plugins_scan_dir(const char *dirname, plugin_load_failure_mode mode) gchar *dot; int cr; + if (!g_file_test(dirname, G_FILE_TEST_EXISTS) || !g_file_test(dirname, G_FILE_TEST_IS_DIR)) { + return; + } + if ((dir = ws_dir_open(dirname, 0, NULL)) != NULL) { while ((file = ws_dir_read_name(dir)) != NULL) @@ -180,6 +184,7 @@ plugins_scan_dir(const char *dirname, plugin_load_failure_mode mode) #endif g_snprintf(filename, FILENAME_LEN, "%s" G_DIR_SEPARATOR_S "%s", dirname, name); + if ((handle = g_module_open(filename, G_MODULE_BIND_LOCAL)) == NULL) { /* @@ -265,7 +270,6 @@ plugins_scan_dir(const char *dirname, plugin_load_failure_mode mode) g_free(new_plug); continue; } - } ws_dir_close(dir); } @@ -422,6 +426,29 @@ plugins_dump_all(void) plugins_get_descriptions(print_plugin_description, NULL); } +void +plugins_cleanup(void) +{ + plugin* prev; + plugin* cur; + + if (!plugin_list) + return; + + prev = plugin_list; + cur = plugin_list->next; + + do { + g_free(prev->name); + g_free(prev); + prev = cur; + cur = cur->next; + } while(cur); + + g_free(prev->name); + g_free(prev); +} + #endif /* HAVE_PLUGINS */ /* diff --git a/wsutil/plugins.h b/wsutil/plugins.h index 677c6d3f0b..89751ee2fb 100644 --- a/wsutil/plugins.h +++ b/wsutil/plugins.h @@ -45,6 +45,7 @@ typedef void (*plugin_description_callback)(const char *, const char *, void *); WS_DLL_PUBLIC void plugins_get_descriptions(plugin_description_callback callback, void *user_data); WS_DLL_PUBLIC void plugins_dump_all(void); +WS_DLL_PUBLIC void plugins_cleanup(void); #ifdef __cplusplus } -- cgit v1.2.1