From 4c8573ac2b72c672a239061b1cca3ba809dad99d Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Fri, 24 Oct 2014 15:09:35 -0600 Subject: [PATCH] Free up plugin info structs after converting to plugin containers. --- src/load_plugins.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/load_plugins.c b/src/load_plugins.c index 0540a0a22..d7185cd9f 100644 --- a/src/load_plugins.c +++ b/src/load_plugins.c @@ -270,11 +270,24 @@ sudo_load_plugin(struct plugin_container *policy_plugin, } } + /* Zero out info strings that we now own (see above). */ + info->symbol_name = NULL; + info->options = NULL; + rval = true; done: debug_return_bool(rval); } +static void +free_plugin_info(struct plugin_info *info) +{ + sudo_efree(info->path); + sudo_efree(info->options); + sudo_efree(info->symbol_name); + sudo_efree(info); +} + /* * Load the plugins listed in sudo.conf. */ @@ -284,17 +297,19 @@ sudo_load_plugins(struct plugin_container *policy_plugin, { struct plugin_container *container; struct plugin_info_list *plugins; - struct plugin_info *info; + struct plugin_info *info, *next; bool rval = false; debug_decl(sudo_load_plugins, SUDO_DEBUG_PLUGIN, sudo_debug_instance) - /* Walk the plugin list from sudo.conf, if any. */ + /* Walk the plugin list from sudo.conf, if any and free it. */ plugins = sudo_conf_plugins(); - TAILQ_FOREACH(info, plugins, entries) { + TAILQ_FOREACH_SAFE(info, plugins, entries, next) { rval = sudo_load_plugin(policy_plugin, io_plugins, info); if (!rval) goto done; + free_plugin_info(info); } + TAILQ_INIT(plugins); /* * If no policy plugin, fall back to the default (sudoers). -- 2.49.0