Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordseshadri <dseshadri@hp.com>2021-06-24 18:32:45 +0300
committerGitHub <noreply@github.com>2021-06-24 18:32:45 +0300
commitfb6d22def5c86013b6044c5a8e121429af182b6f (patch)
treeee20dbf15b79007d2042e2d8498acc23aa52560e
parentdf315455b4ee7ffb89806a0c9d58a0ecddb5938f (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.c24
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