From 17ae66f5673e641b4ebd28e21754fb0e4bef4bed Mon Sep 17 00:00:00 2001 From: kib Date: Mon, 10 Oct 2011 13:03:14 +0000 Subject: [PATCH] MFC r225894: The sigwait(3) function shall not return EINTR, according to the POSIX/SUSvN. The sigwait(2) syscall does return EINTR, and libc.so.7 contains the wrapper sigwait(3) which hides EINTR from callers. The EINTR return is used by libthr to handle required cancellation point in the sigwait(3). To help the binaries linked against pre-libc.so.7, i.e. RELENG_6 and earlier, to have right ABI for sigwait(3), transform EINTR return from sigwait(2) into ERESTART. git-svn-id: svn://svn.freebsd.org/base/stable/8@226205 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/kern/kern_sig.c | 2 ++ sys/sys/param.h | 1 + 2 files changed, 3 insertions(+) diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index c304e3a81..95a9bbf49 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1102,6 +1102,8 @@ 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); td->td_retval[0] = error; diff --git a/sys/sys/param.h b/sys/sys/param.h index 2f426aaff..f77583783 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -61,6 +61,7 @@ #define __FreeBSD_version 802512 /* Master, propagated to newvers */ #ifdef _KERNEL +#define P_OSREL_SIGWAIT 700000 #define P_OSREL_SIGSEGV 700004 #define P_OSREL_MAP_ANON 800104 #endif -- 2.45.0