Bug#729697: libc0.1: wait6 is broken on 9.2+
Package: libc0.1
Severity: serious
Dear Maintainer,
FreeBSD 9.2+ kernels have broken implementation of wait6 syscall.
In particular:
* if pointer to siginfo_t structured is passed
* and WEXITED is ORed in options
The return value of siginfo_t.si_status is wrong.
It is returned the same as "status", instead of result of
WEXITSTATUS(status).
Thus this is an "off-by-one" error, or more precisely off-by-bitmask
error.
A PR has been filed in FreeBSD at:
http://www.freebsd.org/cgi/query-pr.cgi?pr=misc/184002
Affected kernels are 9.2+ all the way to HEAD.
I've chatted with developers on #bsddev and they are recognising that
this is a severe bug, as current behaviour doesn't comply with
freebsd/linux manpages, POSIX, other implmentations of waitid.
Furthermore, it appears that other functions that set values of
siginfo_t.si_status incorrectly in other parts of FreeBSD kernels.
E.g. sigwaitinfo() from stable/8 onwards...
The wait6 / waitid() calls are added in the eglibc2.18 debian packaging
branch. Therefore I request to do following:
* make wait6() a proper wrapper around wait6 syscall and correct
si_status.
* make waitid implementation use the wait6() wrapper
An example patch against current waitid patch, as I don't know how to
make proper syscall wrapper functions, is attached.
Please advice if Debian kFreeBSD maintainers are willing to patch this
issue in the kernels ahead of FreeBSD releasing fixes / updates (at
least for the wait6 syscall)
Regards,
Dmitrijs.
Reply to: