aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-06-06 23:00:10 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-06-22 01:45:31 +0000
commit299912abf26990afdc406ecd3a12f256a8080afe (patch)
treee8126aa2136cb7904f69fd28c524275e52040651
parenta1022bc53e6b80512ada0ef10fd500861e5c086d (diff)
downloadsrc-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.c20
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