aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2022-10-29 10:42:30 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2022-10-29 10:42:30 +0100
commita18c2f7c4b3628b33b7fde7508f4bd1763a9cde4 (patch)
tree5d38afeac462efcd0fe50a4d1199696e794d57dd
parent5bf1a1a224ba338dceb638691c8dc1bf4be9a866 (diff)
downloadrspamd-a18c2f7c4b3628b33b7fde7508f4bd1763a9cde4.tar.gz
rspamd-a18c2f7c4b3628b33b7fde7508f4bd1763a9cde4.zip
[Minor] Plug memory leak for sigaltstack
-rw-r--r--src/controller.c1
-rw-r--r--src/fuzzy_storage.c1
-rw-r--r--src/hs_helper.c1
-rw-r--r--src/libserver/worker_util.c28
-rw-r--r--src/libserver/worker_util.h5
-rw-r--r--src/rspamd.c1
-rw-r--r--src/rspamd_proxy.c1
-rw-r--r--src/worker.c1
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
@@ -231,6 +231,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
* @param ev_base
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);
}