From: GNU Libc Maintainers Date: Wed, 31 Jan 2024 20:45:37 +0000 (+0100) Subject: git-exec-intr X-Git-Tag: archive/raspbian/2.37-15_deb13u1+rpi1^2~56 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6e64d1ff6ad51945d9f083d5589b07895c2c2910;p=glibc.git git-exec-intr commit 49b308a26e2a9e02ef396f67f59c462ad4171ea4 Author: Samuel Thibault Date: Mon Nov 20 19:19:50 2023 +0100 hurd: Prevent the final file_exec_paths call from signals Otherwise if the exec server started thrashing the old task, we won't be able to restart the exec. This notably fixes building ghc. Gbp-Pq: Topic hurd-i386 Gbp-Pq: Name git-exec-intr.diff --- diff --git a/hurd/hurdexec.c b/hurd/hurdexec.c index f8f174e4a..e63dea990 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 f45311a0c..7c8381145 100644 --- a/sysdeps/mach/hurd/spawni.c +++ b/sysdeps/mach/hurd/spawni.c @@ -807,6 +807,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, @@ -819,7 +831,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, @@ -828,6 +840,8 @@ retry: ints, INIT_INT_MAX, NULL, 0, NULL, 0); + __sigprocmask (SIG_SETMASK, &old, NULL); + return err; }