mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 12:30:06 +00:00
posix: Correctly block/unblock all signals on Linux posix_spawn
This patch correctly block and unblocks all signals when executing Linux posix_spawn by using the __libc_signal_{un}block_all functions instead of default sigprocmask. The latter might remove both SIGCANCEL and SIGSETXID from the blocked signal list. Checked on x86_64, i686, powerpc64le, and aarch64. * sysdeps/unix/sysv/linux/spawni.c (__spawnix): Correctly block and unblock all signals when executing the clone vfork child. (SIGALL_SET): Remove macro.
This commit is contained in:
parent
706e6749de
commit
802c1c5a65
@ -1,5 +1,9 @@
|
||||
2016-09-20 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
* sysdeps/unix/sysv/linux/spawni.c (__spawnix): Correctly block and unblock
|
||||
all signals when executing the clone vfork child.
|
||||
(SIGALL_SET): Remove macro.
|
||||
|
||||
* nptl/Makefile (tests): Add tst-exec5.
|
||||
* nptl/tst-exec5.c: New file.
|
||||
* sysdeps/unix/sysv/linux/spawni.c (__spawni): Correctly enable and disable
|
||||
|
@ -58,10 +58,6 @@
|
||||
normal program exit with the exit code 127. */
|
||||
#define SPAWN_ERROR 127
|
||||
|
||||
/* We need to block both SIGCANCEL and SIGSETXID. */
|
||||
#define SIGALL_SET \
|
||||
((__sigset_t) { .__val = {[0 ... _SIGSET_NWORDS-1 ] = -1 } })
|
||||
|
||||
#ifdef __ia64__
|
||||
# define CLONE(__fn, __stack, __stacksize, __flags, __args) \
|
||||
__clone2 (__fn, __stack, __stacksize, __flags, __args, 0, 0, 0)
|
||||
@ -353,7 +349,7 @@ __spawnix (pid_t * pid, const char *file,
|
||||
args.envp = envp;
|
||||
args.xflags = xflags;
|
||||
|
||||
__sigprocmask (SIG_BLOCK, &SIGALL_SET, &args.oldmask);
|
||||
__libc_signal_block_all (&args.oldmask);
|
||||
|
||||
/* The clone flags used will create a new child that will run in the same
|
||||
memory space (CLONE_VM) and the execution of calling thread will be
|
||||
@ -386,7 +382,7 @@ __spawnix (pid_t * pid, const char *file,
|
||||
if ((ec == 0) && (pid != NULL))
|
||||
*pid = new_pid;
|
||||
|
||||
__sigprocmask (SIG_SETMASK, &args.oldmask, 0);
|
||||
__libc_signal_restore_set (&args.oldmask);
|
||||
|
||||
__libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user