]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Plug memory leak for sigaltstack
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 29 Oct 2022 09:42:30 +0000 (10:42 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sat, 29 Oct 2022 09:42:30 +0000 (10:42 +0100)
src/controller.c
src/fuzzy_storage.c
src/hs_helper.c
src/libserver/worker_util.c
src/libserver/worker_util.h
src/rspamd.c
src/rspamd_proxy.c
src/worker.c

index 0ff7d64c07d117815763d3ac4eba7414008673d8..7250291f034b6f46e81f1084c501c7147b309003 100644 (file)
@@ -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);
 }
index 8dc27e4b4280ee5ceac7c4e11628ce37e3d15c6c..bdbc2b08de9ded4c2fcfb57a76d712dceeedeec4 100644 (file)
@@ -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);
 }
index e57859696b9097f31ee7b590a347cab04374f973..5995ce5e9f60b52b135ba27c79bd233bccaeabc7 100644 (file)
@@ -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);
 }
index 4529e4ee0d27c5deb7e3fd16e63b2e3dba6f825a..92ae46bf0ee24a45f1712e2f62767a5d91a05f74 100644 (file)
@@ -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)
 {
index c215f95237049d75a554a4a7f60e9e72fbeec28e..38ba9c0d765fa7ca5cf7e1df268bf839c399376e 100644 (file)
@@ -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
index d8371de55c2368e98ea8f6657c546fa3a8a71c79..d0b38285647ea64f1c108d77df870595c53f177f 100644 (file)
@@ -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 ();
index 3bf83b0e4a36e8347124974df0d881dabb5d56e8..80c28b975d66b4eb9a26ab7219cfc6bc4504c381 100644 (file)
@@ -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);
 }
index 26cdc2390e3d6aaf2ddd5146f2ea93f4ba1b87c7..10f7c076c0b130a241dadb93c8831877bf30a8cf 100644 (file)
@@ -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);
 }