]> granicus.if.org Git - sudo/commitdiff
Free up plugin info structs after converting to plugin containers.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 24 Oct 2014 21:09:35 +0000 (15:09 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Fri, 24 Oct 2014 21:09:35 +0000 (15:09 -0600)
src/load_plugins.c

index 0540a0a2262b9ec969a6d943722881b20c2d75eb..d7185cd9f915eb334280e0faa20fcba7ba72cda9 100644 (file)
@@ -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).