From a18c2f7c4b3628b33b7fde7508f4bd1763a9cde4 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Sat, 29 Oct 2022 10:42:30 +0100 Subject: [PATCH] [Minor] Plug memory leak for sigaltstack --- src/controller.c | 1 + src/fuzzy_storage.c | 1 + src/hs_helper.c | 1 + src/libserver/worker_util.c | 28 ++++++++++++++++++++++------ src/libserver/worker_util.h | 5 +++++ src/rspamd.c | 1 + src/rspamd_proxy.c | 1 + src/worker.c | 1 + 8 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/controller.c b/src/controller.c index 0ff7d64c0..7250291f0 100644 --- a/src/controller.c +++ b/src/controller.c @@ -4294,6 +4294,7 @@ start_controller_worker (struct rspamd_worker *worker) REF_RELEASE (ctx->cfg); rspamd_log_close (worker->srv->logger); + rspamd_unset_crash_handler (worker->srv); exit (EXIT_SUCCESS); } diff --git a/src/fuzzy_storage.c b/src/fuzzy_storage.c index 8dc27e4b4..bdbc2b08d 100644 --- a/src/fuzzy_storage.c +++ b/src/fuzzy_storage.c @@ -2752,6 +2752,7 @@ start_fuzzy (struct rspamd_worker *worker) REF_RELEASE (ctx->cfg); rspamd_log_close (worker->srv->logger); + rspamd_unset_crash_handler (worker->srv); exit (EXIT_SUCCESS); } diff --git a/src/hs_helper.c b/src/hs_helper.c index e57859696..5995ce5e9 100644 --- a/src/hs_helper.c +++ b/src/hs_helper.c @@ -415,6 +415,7 @@ start_hs_helper (struct rspamd_worker *worker) rspamd_log_close (worker->srv->logger); REF_RELEASE (ctx->cfg); + rspamd_unset_crash_handler (worker->srv); exit (EXIT_SUCCESS); } diff --git a/src/libserver/worker_util.c b/src/libserver/worker_util.c index 4529e4ee0..92ae46bf0 100644 --- a/src/libserver/worker_util.c +++ b/src/libserver/worker_util.c @@ -1664,12 +1664,6 @@ rspamd_set_crash_handler (struct rspamd_main *rspamd_main) stack_t ss; memset (&ss, 0, sizeof ss); - /* - * Allocate special stack, NOT freed at the end so far - * It also cannot be on stack as this memory is used when - * stack corruption is detected. Leak sanitizer blames about it but - * I don't know any good ways to stop this behaviour. - */ ss.ss_size = MAX (SIGSTKSZ, 8192 * 4); stack_mem = g_malloc0 (ss.ss_size); ss.ss_sp = stack_mem; @@ -1687,6 +1681,28 @@ rspamd_set_crash_handler (struct rspamd_main *rspamd_main) #endif } +RSPAMD_NO_SANITIZE void rspamd_unset_crash_handler (struct rspamd_main *unused_) +{ +#ifdef HAVE_SIGALTSTACK + int ret; + stack_t ss; + ret = sigaltstack (NULL, &ss); + + if (ret != -1) { + if (ss.ss_size > 0 && ss.ss_sp) { + g_free(ss.ss_sp); + } + + ss.ss_size = 0; + ss.ss_sp = NULL; +#ifdef SS_DISABLE + ss.ss_flags |= SS_DISABLE; +#endif + sigaltstack(&ss, NULL); + } +#endif +} + static void rspamd_enable_accept_event (EV_P_ ev_timer *w, int revents) { diff --git a/src/libserver/worker_util.h b/src/libserver/worker_util.h index c215f9523..38ba9c0d7 100644 --- a/src/libserver/worker_util.h +++ b/src/libserver/worker_util.h @@ -230,6 +230,11 @@ struct rspamd_worker *rspamd_fork_worker (struct rspamd_main *, */ RSPAMD_NO_SANITIZE void rspamd_set_crash_handler (struct rspamd_main *); +/** + * Restore memory for crash signals + */ +RSPAMD_NO_SANITIZE void rspamd_unset_crash_handler (struct rspamd_main *); + /** * Initialise the main monitoring worker * @param worker diff --git a/src/rspamd.c b/src/rspamd.c index d8371de55..d0b382856 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -1660,6 +1660,7 @@ main (gint argc, gchar **argv, gchar **env) rspamd_pidfile_close (rspamd_main->pfh); } + rspamd_unset_crash_handler (rspamd_main); g_free (rspamd_main); ev_unref (event_loop); sqlite3_shutdown (); diff --git a/src/rspamd_proxy.c b/src/rspamd_proxy.c index 3bf83b0e4..80c28b975 100644 --- a/src/rspamd_proxy.c +++ b/src/rspamd_proxy.c @@ -2461,6 +2461,7 @@ start_rspamd_proxy (struct rspamd_worker *worker) REF_RELEASE (ctx->cfg); rspamd_log_close (worker->srv->logger); + rspamd_unset_crash_handler (worker->srv); exit (EXIT_SUCCESS); } diff --git a/src/worker.c b/src/worker.c index 26cdc2390..10f7c076c 100644 --- a/src/worker.c +++ b/src/worker.c @@ -559,6 +559,7 @@ start_worker (struct rspamd_worker *worker) rspamd_stat_close (); REF_RELEASE (ctx->cfg); rspamd_log_close (worker->srv->logger); + rspamd_unset_crash_handler (worker->srv); exit (EXIT_SUCCESS); } -- 2.39.5