From 68cf5243462e0e9b743e420ab57a0be11055fc78 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Fri, 27 Sep 2019 12:46:37 +0100 Subject: [PATCH] [Minor] Fix various static leaks --- src/rspamadm/commands.c | 5 +++-- src/rspamadm/configdump.c | 4 +++- src/rspamadm/confighelp.c | 2 ++ src/rspamadm/configtest.c | 11 +++++----- src/rspamadm/control.c | 3 +++ src/rspamadm/dkim_keygen.c | 2 ++ src/rspamadm/fuzzy_convert.c | 3 +++ src/rspamadm/lua_repl.c | 3 +++ src/rspamadm/pw.c | 3 +++ src/rspamadm/rspamadm.c | 39 ++++++++++++++++++++++++++++-------- src/rspamadm/rspamadm.h | 5 +++-- src/rspamadm/signtool.c | 3 +++ src/rspamadm/stat_convert.c | 3 +++ 13 files changed, 68 insertions(+), 18 deletions(-) diff --git a/src/rspamadm/commands.c b/src/rspamadm/commands.c index cf3143136..f379ff802 100644 --- a/src/rspamadm/commands.c +++ b/src/rspamadm/commands.c @@ -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); } diff --git a/src/rspamadm/configdump.c b/src/rspamadm/configdump.c index 8f38cdf61..32e8ab3f1 100644 --- a/src/rspamadm/configdump.c +++ b/src/rspamadm/configdump.c @@ -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; diff --git a/src/rspamadm/confighelp.c b/src/rspamadm/confighelp.c index a5b67a400..53f8dbbe9 100644 --- a/src/rspamadm/confighelp.c +++ b/src/rspamadm/confighelp.c @@ -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 */ diff --git a/src/rspamadm/configtest.c b/src/rspamadm/configtest.c index 3b7a6b5b0..6c07959db 100644 --- a/src/rspamadm/configtest.c +++ b/src/rspamadm/configtest.c @@ -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); } diff --git a/src/rspamadm/control.c b/src/rspamadm/control.c index 2f73d09ca..e605ecb0a 100644 --- a/src/rspamadm/control.c +++ b/src/rspamadm/control.c @@ -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); diff --git a/src/rspamadm/dkim_keygen.c b/src/rspamadm/dkim_keygen.c index 62b47f557..64e71f36e 100644 --- a/src/rspamadm/dkim_keygen.c +++ b/src/rspamadm/dkim_keygen.c @@ -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); } diff --git a/src/rspamadm/fuzzy_convert.c b/src/rspamadm/fuzzy_convert.c index c59200bc7..11386de65 100644 --- a/src/rspamadm/fuzzy_convert.c +++ b/src/rspamadm/fuzzy_convert.c @@ -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); diff --git a/src/rspamadm/lua_repl.c b/src/rspamadm/lua_repl.c index 54a2ed01e..17061929a 100644 --- a/src/rspamadm/lua_repl.c +++ b/src/rspamadm/lua_repl.c @@ -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; diff --git a/src/rspamadm/pw.c b/src/rspamadm/pw.c index b00aac223..0fea5c359 100644 --- a/src/rspamadm/pw.c +++ b/src/rspamadm/pw.c @@ -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); diff --git a/src/rspamadm/rspamadm.c b/src/rspamadm/rspamadm.c index 565601956..6108a179b 100644 --- a/src/rspamadm/rspamadm.c +++ b/src/rspamadm/rspamadm.c @@ -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; } diff --git a/src/rspamadm/rspamadm.h b/src/rspamadm/rspamadm.h index e1a638df7..de499112a 100644 --- a/src/rspamadm/rspamadm.h +++ b/src/rspamadm/rspamadm.h @@ -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; diff --git a/src/rspamadm/signtool.c b/src/rspamadm/signtool.c index eae55b8bd..d92071bfa 100644 --- a/src/rspamadm/signtool.c +++ b/src/rspamadm/signtool.c @@ -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; } diff --git a/src/rspamadm/stat_convert.c b/src/rspamadm/stat_convert.c index e3a3e179b..cea366f76 100644 --- a/src/rspamadm/stat_convert.c +++ b/src/rspamadm/stat_convert.c @@ -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; -- 2.39.5