diff options
author | dseshadri <dseshadri@hp.com> | 2021-06-24 18:32:45 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-24 18:32:45 +0300 |
commit | fb6d22def5c86013b6044c5a8e121429af182b6f (patch) | |
tree | ee20dbf15b79007d2042e2d8498acc23aa52560e | |
parent | df315455b4ee7ffb89806a0c9d58a0ecddb5938f (diff) |
Fix for heap_use_after_free flagged by sanitizer (#21120)
This change is released under the MIT license.
-rw-r--r-- | mono/mini/mini-posix.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/mono/mini/mini-posix.c b/mono/mini/mini-posix.c index cd83a4d1161..dc8a6f2a1ee 100644 --- a/mono/mini/mini-posix.c +++ b/mono/mini/mini-posix.c @@ -149,18 +149,31 @@ mono_runtime_cleanup_handlers (void) static GHashTable *mono_saved_signal_handlers = NULL; static struct sigaction * -get_saved_signal_handler (int signo, gboolean remove) +get_saved_signal_handler (int signo) { if (mono_saved_signal_handlers) { /* The hash is only modified during startup, so no need for locking */ struct sigaction *handler = (struct sigaction*)g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo)); - if (remove && handler) - g_hash_table_remove (mono_saved_signal_handlers, GINT_TO_POINTER (signo)); return handler; } return NULL; } + +static void +remove_saved_signal_handler (int signo) +{ + if (mono_saved_signal_handlers) { + /* The hash is only modified during startup, so no need for locking */ + struct sigaction *handler = (struct sigaction*)g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo)); + if (handler) + g_hash_table_remove (mono_saved_signal_handlers, GINT_TO_POINTER (signo)); + } + return; +} + + + static void save_old_signal_handler (int signo, struct sigaction *old_action) { @@ -202,7 +215,7 @@ gboolean MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal) { int signal = MONO_SIG_HANDLER_GET_SIGNO (); - struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal, FALSE); + struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal); if (saved_handler && saved_handler->sa_handler) { if (!(saved_handler->sa_flags & SA_SIGINFO)) { @@ -404,7 +417,7 @@ static void remove_signal_handler (int signo) { struct sigaction sa; - struct sigaction *saved_action = get_saved_signal_handler (signo, TRUE); + struct sigaction *saved_action = get_saved_signal_handler (signo); if (!saved_action) { sa.sa_handler = SIG_DFL; @@ -415,6 +428,7 @@ remove_signal_handler (int signo) } else { g_assert (sigaction (signo, saved_action, NULL) != -1); } + remove_saved_signal_handler(signo); } void |