[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: