diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2021-06-06 23:00:10 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2021-06-22 01:45:31 +0000 |
commit | 299912abf26990afdc406ecd3a12f256a8080afe (patch) | |
tree | e8126aa2136cb7904f69fd28c524275e52040651 | |
parent | a1022bc53e6b80512ada0ef10fd500861e5c086d (diff) | |
download | src-299912abf26990afdc406ecd3a12f256a8080afe.tar.gz src-299912abf26990afdc406ecd3a12f256a8080afe.zip |
sigwait(2) and sigtimedwait(2) must not be restarted.
(cherry picked from commit afb36e289c1d96053b6063b0e548fc7d31dbd239)
-rw-r--r-- | sys/kern/kern_sig.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 0453d3b2702c..a2709f38c5cb 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1168,9 +1168,7 @@ sys_sigwait(struct thread *td, struct sigwait_args *uap) error = kern_sigtimedwait(td, set, &ksi, NULL); if (error) { if (error == EINTR && td->td_proc->p_osrel < P_OSREL_SIGWAIT) - error = ERESTART; - if (error == ERESTART) - return (error); + return (ERESTART); td->td_retval[0] = error; return (0); } @@ -1329,15 +1327,13 @@ kern_sigtimedwait(struct thread *td, sigset_t waitset, ksiginfo_t *ksi, error = msleep(ps, &p->p_mtx, PPAUSE|PCATCH, "sigwait", timo); - if (timeout != NULL) { - if (error == ERESTART) { - /* Timeout can not be restarted. */ - error = EINTR; - } else if (error == EAGAIN) { - /* We will calculate timeout by ourself. */ - error = 0; - } - } + /* The syscalls can not be restarted. */ + if (error == ERESTART) + error = EINTR; + + /* We will calculate timeout by ourself. */ + if (timeout != NULL && error == EAGAIN) + error = 0; /* * If PTRACE_SCE or PTRACE_SCX were set after |