commit-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[hurd, commited] hurd: Prevent the final file_exec_paths call from signa


From: Samuel Thibault
Subject: [hurd, commited] hurd: Prevent the final file_exec_paths call from signals
Date: Mon, 20 Nov 2023 23:28:31 +0100

Otherwise if the exec server started thrashing the old task,
we won't be able to restart the exec.

This notably fixes building ghc.
---
 hurd/hurdexec.c            | 12 ++++++++++++
 sysdeps/mach/hurd/spawni.c | 16 +++++++++++++++-
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c
index e358d846c8..317d7ea0ad 100644
--- a/hurd/hurdexec.c
+++ b/hurd/hurdexec.c
@@ -362,6 +362,7 @@ retry:
   if (!err)
     {
       int flags;
+      sigset_t old, new;
 
       if (pdp)
        {
@@ -420,6 +421,15 @@ retry:
       if (__sigismember (&_hurdsig_traced, SIGKILL))
        flags |= EXEC_SIGTRAP;
 #endif
+
+     /* Avoid getting interrupted while exec(), notably not after the exec
+        server has committed to the exec and started thrashing us.
+
+        TODO Rather add proper interrupt support to the exec server, that
+        avoids interrupts in that period.  */
+      __sigfillset (&new);
+      __sigprocmask (SIG_SETMASK, &new, &old);
+
       err = __file_exec_paths (file, task, flags,
                               path ? path : "",
                               abspath ? abspath : "",
@@ -440,6 +450,8 @@ retry:
                           ints, INIT_INT_MAX,
                           please_dealloc, pdp - please_dealloc,
                           portnames, nportnames);
+
+      __sigprocmask (SIG_SETMASK, &old, NULL);
     }
 
   /* Release references to the standard ports.  */
diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c
index 9516001817..58a89b45f3 100644
--- a/sysdeps/mach/hurd/spawni.c
+++ b/sysdeps/mach/hurd/spawni.c
@@ -812,6 +812,18 @@ retry:
 
     inline error_t exec (file_t file)
       {
+       sigset_t old, new;
+
+       /* Avoid getting interrupted while exec(), notably not after the exec
+          server has committed to the exec and started thrashing the task.
+
+          Various issues otherwise show up when building e.g. ghc.
+
+          TODO Rather add proper interrupt support to the exec server, that
+          avoids interrupts in that period.  */
+       __sigfillset(&new);
+       __sigprocmask (SIG_SETMASK, &new, &old);
+
        error_t err = __file_exec_paths
          (file, task,
           __sigismember (&_hurdsig_traced, SIGKILL) ? EXEC_SIGTRAP : 0,
@@ -824,7 +836,7 @@ retry:
        /* Fallback for backwards compatibility.  This can just be removed
           when __file_exec goes away.  */
        if (err == MIG_BAD_ID)
-         return __file_exec (file, task,
+         err = __file_exec (file, task,
                              (__sigismember (&_hurdsig_traced, SIGKILL)
                              ? EXEC_SIGTRAP : 0),
                              args, argslen, env, envlen,
@@ -833,6 +845,8 @@ retry:
                              ints, INIT_INT_MAX,
                              NULL, 0, NULL, 0);
 
+       __sigprocmask (SIG_SETMASK, &old, NULL);
+
        return err;
       }
 
-- 
2.42.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]