提交 7cc49f98 编写于 作者: R Rich Felker

fix breakage in synccall due to incorrect signal restoration in sigqueue

commit 07827d1a seems to have
introduced this issue. sigqueue is called from the synccall core, at
which time, even implementation-internal signals are blocked. however,
pthread_sigmask removes the implementation-internal signals from the
old mask before returning, so that a process which began life with
them blocked will not be able to save a signal mask that has them
blocked, possibly causing them to become re-blocked later. however,
this was causing sigqueue to unblock the implementation-internal
signals during synccall, leading to deadlock.
上级 d0f0fa48
......@@ -3,6 +3,7 @@
#include <unistd.h>
#include <stdint.h>
#include "syscall.h"
#include "pthread_impl.h"
int sigqueue(pid_t pid, int sig, const union sigval value)
{
......@@ -14,9 +15,9 @@ int sigqueue(pid_t pid, int sig, const union sigval value)
si.si_code = SI_QUEUE;
si.si_value = value;
si.si_uid = getuid();
pthread_sigmask(SIG_BLOCK, (void *)(uint64_t[1]){-1}, &set);
__block_app_sigs(&set);
si.si_pid = getpid();
r = syscall(SYS_rt_sigqueueinfo, pid, sig, &si);
pthread_sigmask(SIG_SETMASK, &set, 0);
__restore_sigs(&set);
return r;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册