]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Fix various static leaks
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 27 Sep 2019 11:46:37 +0000 (12:46 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 27 Sep 2019 11:46:37 +0000 (12:46 +0100)
13 files changed:
src/rspamadm/commands.c
src/rspamadm/configdump.c
src/rspamadm/confighelp.c
src/rspamadm/configtest.c
src/rspamadm/control.c
src/rspamadm/dkim_keygen.c
src/rspamadm/fuzzy_convert.c
src/rspamadm/lua_repl.c
src/rspamadm/pw.c
src/rspamadm/rspamadm.c
src/rspamadm/rspamadm.h
src/rspamadm/signtool.c
src/rspamadm/stat_convert.c

index cf3143136843fbf074fb31b36d356c9c0f3f3897..f379ff8022f11362aeec15259f2f860e0ac0c23b 100644 (file)
@@ -266,14 +266,15 @@ rspamadm_fill_lua_commands (lua_State *L, GPtrArray *dest)
                        lua_pushvalue (L, -1);
                        /* Reference table itself */
                        lua_cmd->command_data = GINT_TO_POINTER (luaL_ref (L, LUA_REGISTRYINDEX));
-                       lua_cmd->flags |= RSPAMADM_FLAG_LUA;
+                       lua_cmd->flags |= RSPAMADM_FLAG_LUA|RSPAMADM_FLAG_DYNAMIC;
                        lua_cmd->run = rspamadm_lua_command_run;
                        lua_cmd->help = rspamadm_lua_command_help;
 
-
                        g_ptr_array_add (dest, lua_cmd);
                }
 
                lua_settop (L, 0);
        }
+
+       g_ptr_array_free (lua_paths, TRUE);
 }
index 8f38cdf61efad50fc1ee653093d4ef8f24b5c468..32e8ab3f1223a4349c8071c4c888e1df05862fc2 100644 (file)
@@ -263,9 +263,12 @@ rspamadm_configdump (gint argc, gchar **argv, const struct rspamadm_command *cmd
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (config == NULL) {
                if ((confdir = g_hash_table_lookup (ucl_vars, "CONFDIR")) == NULL) {
                        confdir = RSPAMD_CONFDIR;
@@ -282,7 +285,6 @@ rspamadm_configdump (gint argc, gchar **argv, const struct rspamadm_command *cmd
                pworker++;
        }
 
-       cfg->cache = rspamd_symcache_new (cfg);
        cfg->compiled_modules = modules;
        cfg->compiled_workers = workers;
        cfg->cfg_name = config;
index a5b67a400a9f08476fcccad7911824c6098562fe..53f8dbbe9f5e2a243e71638c935ce8c7e3b2ad0e 100644 (file)
@@ -216,9 +216,11 @@ rspamadm_confighelp (gint argc, gchar **argv, const struct rspamadm_command *cmd
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                rspamd_fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
        pworker = &workers[0];
        while (*pworker) {
                /* Init string quarks */
index 3b7a6b5b0545bda4fa866b6c2b86c90b4524ebab..6c07959dbc6d86fe6da29b9ae484372a421186f4 100644 (file)
@@ -121,9 +121,12 @@ rspamadm_configtest (gint argc, gchar **argv, const struct rspamadm_command *cmd
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (config == NULL) {
                if ((confdir = g_hash_table_lookup (ucl_vars, "CONFDIR")) == NULL) {
                        confdir = RSPAMD_CONFDIR;
@@ -139,7 +142,7 @@ rspamadm_configtest (gint argc, gchar **argv, const struct rspamadm_command *cmd
                (void) g_quark_from_static_string ((*pworker)->name);
                pworker++;
        }
-       cfg->cache = rspamd_symcache_new (cfg);
+
        cfg->compiled_modules = modules;
        cfg->compiled_workers = workers;
        cfg->cfg_name = config;
@@ -160,8 +163,8 @@ rspamadm_configtest (gint argc, gchar **argv, const struct rspamadm_command *cmd
                        ret = rspamd_config_post_load (cfg, RSPAMD_CONFIG_INIT_SYMCACHE);
                }
 
-               if (ret && !rspamd_symcache_validate (rspamd_main->cfg->cache,
-                               rspamd_main->cfg,
+               if (ret && !rspamd_symcache_validate (cfg->cache,
+                               cfg,
                                FALSE)) {
                        ret = FALSE;
                }
@@ -185,6 +188,4 @@ rspamadm_configtest (gint argc, gchar **argv, const struct rspamadm_command *cmd
        if (!ret) {
                exit (EXIT_FAILURE);
        }
-
-       exit (EXIT_SUCCESS);
 }
index 2f73d09ca1e58d1ab3e6d5c21af03269c4cecb8a..e605ecb0adf82425ccbc53b778c642ce008c7e55 100644 (file)
@@ -185,9 +185,12 @@ rspamadm_control (gint argc, gchar **argv, const struct rspamadm_command *_cmd)
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                rspamd_fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (argc <= 1) {
                rspamd_fprintf (stderr, "command required\n");
                exit (1);
index 62b47f557b44b4bd86040e13877cc020a1a2733e..64e71f36e4884847699110315fdb8f1e60a3e093 100644 (file)
@@ -356,8 +356,10 @@ rspamadm_dkim_keygen (gint argc, gchar **argv, const struct rspamadm_command *cm
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
        rspamadm_dkim_generate_keypair (domain, selector, privkey_file, NULL, bits);
 }
index c59200bc7bdfc102d02eb48f44e18a7e9111df1f..11386de65ed18b1356cf5936c3245ef22ba4cf4f 100644 (file)
@@ -93,9 +93,12 @@ rspamadm_fuzzyconvert (gint argc, gchar **argv, const struct rspamadm_command *c
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                rspamd_fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (!source_db) {
                rspamd_fprintf (stderr, "source db is missing\n");
                exit (1);
index 54a2ed01e1e286940cf50d6388676cac7545abfe..17061929ae0df5c455c91dcb43db578f0ab693d6 100644 (file)
@@ -869,9 +869,12 @@ rspamadm_lua (gint argc, gchar **argv, const struct rspamadm_command *cmd)
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (batch == -1) {
                if (isatty (STDIN_FILENO)) {
                        batch = 0;
index b00aac22367446ffda2d898eb7fda71550842501..0fea5c3590bce04eea1e543e4f32de634b978b29 100644 (file)
@@ -372,9 +372,12 @@ rspamadm_pw (gint argc, gchar **argv, const struct rspamadm_command *cmd)
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (list) {
                rspamadm_alg_list ();
                exit (EXIT_SUCCESS);
index 565601956181fe228bb0b86c2dcd01a09e830573..6108a179b4ed7bd43c0d129d3f52310c42cab47a 100644 (file)
@@ -352,6 +352,21 @@ rspamadm_add_lua_globals (struct rspamd_dns_resolver *resolver)
        lua_setglobal (L, "rspamadm_dns_resolver");
 }
 
+static void
+rspamadm_cmd_dtor (gpointer p)
+{
+       struct rspamadm_command *cmd = (struct rspamadm_command *)p;
+
+       if (cmd->flags & RSPAMADM_FLAG_DYNAMIC) {
+               if (cmd->aliases) {
+                       g_ptr_array_free (cmd->aliases, TRUE);
+               }
+
+               g_free ((gpointer)cmd->name);
+               g_free (cmd);
+       }
+}
+
 gint
 main (gint argc, gchar **argv, gchar **env)
 {
@@ -364,10 +379,12 @@ main (gint argc, gchar **argv, gchar **env)
        const gchar *cmd_name;
        const struct rspamadm_command *cmd;
        struct rspamd_dns_resolver *resolver;
-       GPtrArray *all_commands = g_ptr_array_new (); /* Discovered during check */
+       GPtrArray *all_commands = g_ptr_array_new_full (32,
+                       rspamadm_cmd_dtor); /* Discovered during check */
        gint i, nargc, targc;
        worker_t **pworker;
        gboolean lua_file = FALSE;
+       gint retcode = 0;
 
        ucl_vars = g_hash_table_new_full (rspamd_strcase_hash,
                rspamd_strcase_equal, g_free, g_free);
@@ -417,9 +434,12 @@ main (gint argc, gchar **argv, gchar **env)
        if (!g_option_context_parse (context, &targc, &targv, &error)) {
                fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        /* Setup logger */
        if (verbose) {
                cfg->log_level = G_LOG_LEVEL_DEBUG;
@@ -469,7 +489,7 @@ main (gint argc, gchar **argv, gchar **env)
                rspamd_fprintf (stderr, "Cannot load lua environment: %e", error);
                g_error_free (error);
 
-               exit (EXIT_FAILURE);
+               goto end;
        }
 
        rspamd_lua_set_globals (cfg, L);
@@ -500,15 +520,15 @@ main (gint argc, gchar **argv, gchar **env)
 
        if (show_version) {
                rspamadm_version ();
-               exit (EXIT_SUCCESS);
+               goto end;
        }
        if (show_help) {
                rspamadm_usage (context);
-               exit (EXIT_SUCCESS);
+               goto end;
        }
        if (list_commands) {
                rspamadm_commands (all_commands);
-               exit (EXIT_SUCCESS);
+               goto end;
        }
 
        cmd_name = argv[nargc];
@@ -547,7 +567,8 @@ main (gint argc, gchar **argv, gchar **env)
                        }
                }
 
-               exit (EXIT_FAILURE);
+               retcode = EXIT_FAILURE;
+               goto end;
        }
 
        if (nargc < argc) {
@@ -592,12 +613,14 @@ main (gint argc, gchar **argv, gchar **env)
 
        ev_break (rspamd_main->event_loop, EVBREAK_ALL);
 
-
+end:
+       rspamd_dns_resolver_deinit (resolver);
        REF_RELEASE (rspamd_main->cfg);
        rspamd_log_close (rspamd_main->logger, TRUE);
+       rspamd_url_deinit ();
        g_free (rspamd_main);
        g_ptr_array_free (all_commands, TRUE);
 
-       return 0;
+       return retcode;
 }
 
index e1a638df7b7090c1ac449b026064eab75ac62f63..de499112ab86da0b2e3fc67afd6496ce4c0179bc 100644 (file)
@@ -42,8 +42,9 @@ typedef void (*rspamadm_run_func) (gint argc, gchar **argv,
 
 typedef void (*rspamadm_lua_exports_func) (gpointer lua_state);
 
-#define RSPAMADM_FLAG_NOHELP (1 << 0)
-#define RSPAMADM_FLAG_LUA (1 << 1)
+#define RSPAMADM_FLAG_NOHELP (1u << 0u)
+#define RSPAMADM_FLAG_LUA (1u << 1u)
+#define RSPAMADM_FLAG_DYNAMIC (1u << 2u)
 
 struct rspamadm_command {
        const gchar *name;
index eae55b8bd3ff447428400c06f59ebd795661006e..d92071bfa4b815930af31203b242b7fe0c8c6b86 100644 (file)
@@ -489,9 +489,12 @@ rspamadm_signtool (gint argc, gchar **argv, const struct rspamadm_command *cmd)
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                rspamd_fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (openssl) {
                mode = RSPAMD_CRYPTOBOX_MODE_NIST;
        }
index e3a3e179bffd416aa8315475dd3be22e5d6b7b7e..cea366f76b3a6623150c69c3f02ad083b7e68f8e 100644 (file)
@@ -128,9 +128,12 @@ rspamadm_statconvert (gint argc, gchar **argv, const struct rspamadm_command *cm
        if (!g_option_context_parse (context, &argc, &argv, &error)) {
                rspamd_fprintf (stderr, "option parsing failed: %s\n", error->message);
                g_error_free (error);
+               g_option_context_free (context);
                exit (1);
        }
 
+       g_option_context_free (context);
+
        if (config_file) {
                /* Load config file, assuming that it has all information required */
                struct ucl_parser *parser;