mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
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.
This commit is contained in:
parent
3cbaacdfd2
commit
49b308a26e
@ -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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user