diff options
-rw-r--r-- | hurd/hurdexec.c | 12 | ||||
-rw-r--r-- | sysdeps/mach/hurd/spawni.c | 16 |
2 files changed, 27 insertions, 1 deletions
diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c index e358d84..317d7ea 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 9516001..58a89b4 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; } |