aboutsummaryrefslogtreecommitdiffstats
path: root/wsutil
diff options
context:
space:
mode:
authorDario Lombardo <lomato@gmail.com>2017-02-08 14:25:57 +0100
committerMichael Mann <mmann78@netscape.net>2017-02-18 13:45:14 +0000
commit6d79055ba651c6f1e45b22960c5fd34c75c95133 (patch)
tree02b09c689172f03796eeee0dca4e664286b64a9b /wsutil
parent19b97fbfb0b7aac19c2a2817f4e2cc0f295d4352 (diff)
wsutil: remove leaks from filesystem and plugins code.
Change-Id: Iac2805c0130bd2ba6cdb3c9dd997050274d58d99 Reviewed-on: https://code.wireshark.org/review/20020 Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'wsutil')
-rw-r--r--wsutil/filesystem.c10
-rw-r--r--wsutil/filesystem.h5
-rw-r--r--wsutil/plugins.c29
-rw-r--r--wsutil/plugins.h1
4 files changed, 44 insertions, 1 deletions
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
}