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. Discussed with: davidxu MFC after: 1 week
This commit is contained in:
parent
05806a06c5
commit
8e9a54ee46
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225894
@ -1094,6 +1094,8 @@ 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);
|
||||
td->td_retval[0] = error;
|
||||
|
@ -61,6 +61,7 @@
|
||||
#define __FreeBSD_version 1000000 /* Master, propagated to newvers */
|
||||
|
||||
#ifdef _KERNEL
|
||||
#define P_OSREL_SIGWAIT 700000
|
||||
#define P_OSREL_SIGSEGV 700004
|
||||
#define P_OSREL_MAP_ANON 800104
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user