civodul pushed a commit to branch main
in repository guile.

commit 85520354a8f5de0366c4ac3eb5403aeb27c9515e
Author: Ludovic Courtès <l...@gnu.org>
AuthorDate: Sun Jul 16 18:31:57 2023 +0200

    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.
---
 NEWS               | 2 ++
 libguile/scmsigs.c | 8 ++++++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/NEWS b/NEWS
index f2e00898f..87aefb03f 100644
--- a/NEWS
+++ b/NEWS
@@ -31,6 +31,8 @@ the compiler reports it as "possibly unused".
    (<https://bugs.gnu.org/62501>)
 ** Fix 'system*' with non-file input/output/error port
    (<https://bugs.gnu.org/63024>)
+** Fix possible deadlock in 'sigaction' (aka. 'scm_sigaction_for_thread')
+   (<https://bugs.gnu.org/64666>)
 ** Hashing of UTF-8 symbols with non-ASCII characters avoids corruption
    (<https://bugs.gnu.org/56413>)
 
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))

Reply via email to