Skip to content

Commit 74322d7

Browse files
Fix for heap_use_after_free flagged by sanitizer (#54679)
Copy of mono/mono#21120 Co-authored-by: dseshadri <[email protected]>
1 parent 055a38a commit 74322d7

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

src/mono/mono/mini/mini-posix.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,18 +135,31 @@ mono_runtime_shutdown_handlers (void)
135135
static GHashTable *mono_saved_signal_handlers = NULL;
136136

137137
static struct sigaction *
138-
get_saved_signal_handler (int signo, gboolean remove)
138+
get_saved_signal_handler (int signo)
139139
{
140140
if (mono_saved_signal_handlers) {
141141
/* The hash is only modified during startup, so no need for locking */
142142
struct sigaction *handler = (struct sigaction*)g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
143-
if (remove && handler)
144-
g_hash_table_remove (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
145143
return handler;
146144
}
147145
return NULL;
148146
}
149147

148+
149+
static void
150+
remove_saved_signal_handler (int signo)
151+
{
152+
if (mono_saved_signal_handlers) {
153+
/* The hash is only modified during startup, so no need for locking */
154+
struct sigaction *handler = (struct sigaction*)g_hash_table_lookup (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
155+
if (handler)
156+
g_hash_table_remove (mono_saved_signal_handlers, GINT_TO_POINTER (signo));
157+
}
158+
return;
159+
}
160+
161+
162+
150163
static void
151164
save_old_signal_handler (int signo, struct sigaction *old_action)
152165
{
@@ -181,7 +194,7 @@ gboolean
181194
MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal)
182195
{
183196
int signal = MONO_SIG_HANDLER_GET_SIGNO ();
184-
struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal, FALSE);
197+
struct sigaction *saved_handler = (struct sigaction *)get_saved_signal_handler (signal);
185198

186199
if (saved_handler && saved_handler->sa_handler) {
187200
if (!(saved_handler->sa_flags & SA_SIGINFO)) {
@@ -376,7 +389,7 @@ static void
376389
remove_signal_handler (int signo)
377390
{
378391
struct sigaction sa;
379-
struct sigaction *saved_action = get_saved_signal_handler (signo, TRUE);
392+
struct sigaction *saved_action = get_saved_signal_handler (signo);
380393

381394
if (!saved_action) {
382395
sa.sa_handler = SIG_DFL;
@@ -387,6 +400,7 @@ remove_signal_handler (int signo)
387400
} else {
388401
g_assert (sigaction (signo, saved_action, NULL) != -1);
389402
}
403+
remove_saved_signal_handler(signo);
390404
}
391405

392406
void

0 commit comments

Comments
 (0)