summaryrefslogtreecommitdiff
path: root/libguile/scmsigs.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2023-07-16 18:31:57 +0200
committerLudovic Courtès <ludo@gnu.org>2023-07-16 21:35:47 +0200
commit85520354a8f5de0366c4ac3eb5403aeb27c9515e (patch)
treea09c8081e7d95fdffbf23afc80cd4124d16cc9c4 /libguile/scmsigs.c
parent896960dadeba7770ebbad97514ec6c4d7f18212d (diff)
downloadguile-85520354a8f5de0366c4ac3eb5403aeb27c9515e.tar.gz
Fix possible deadlock in 'scm_sigaction_for_thread'.
Fixes <https://bugs.gnu.org/64666>. * libguile/scmsigs.c (scm_sigaction_for_thread): Swap the 'scm_dynwind_block_asyncs' and 'scm_i_dynwind_pthread_mutex_lock' calls. * NEWS: Update.
Diffstat (limited to 'libguile/scmsigs.c')
-rw-r--r--libguile/scmsigs.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/libguile/scmsigs.c b/libguile/scmsigs.c
index 975d2bd18..d137331f5 100644
--- a/libguile/scmsigs.c
+++ b/libguile/scmsigs.c
@@ -1,4 +1,4 @@
-/* Copyright 1995-2002,2004,2006-2009,2011,2013-2014,2017-2018
+/* Copyright 1995-2002,2004,2006-2009,2011,2013-2014,2017-2018,2023
Free Software Foundation, Inc.
This file is part of Guile.
@@ -336,8 +336,12 @@ SCM_DEFINE (scm_sigaction_for_thread, "sigaction", 1, 3, 0,
scm_i_ensure_signal_delivery_thread ();
scm_dynwind_begin (0);
- scm_i_dynwind_pthread_mutex_lock (&signal_handler_lock);
+
+ /* Among the pending asyncs, there might be signal handlers that will
+ call this very function. Thus, to avoid deadlocks, block asyncs
+ before grabbing SIGNAL_HANDLER_LOCK. */
scm_dynwind_block_asyncs ();
+ scm_i_dynwind_pthread_mutex_lock (&signal_handler_lock);
old_handler = SCM_SIMPLE_VECTOR_REF (*signal_handlers, csig);
if (SCM_UNBNDP (handler))