Fix poll and select POSIX compliancy details about errors
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Thu, 12 Mar 2020 22:47:03 +0000 (22:47 +0000)
committerAurelien Jarno <aurel32@debian.org>
Thu, 12 Mar 2020 22:47:03 +0000 (22:47 +0000)
commite6fd7dc587c6cde6f22c54677c5a6a3cbddf722b
tree75418d056c2b1c4b0af70386caa3d523af7ec2a1
parentb167309e5bd2c16f967c653de8c743e0e76e61ef
Fix poll and select POSIX compliancy details about errors

This fixes the following:

This fixes the following:

- On error, poll must not return without polling, including EBADF, and instead
report POLLHUP/POLLERR/POLLNVAL
- Select must report EBADF if some set contains an invalid FD.

The idea is to move error management to after all select calls, in the
poll/select final treatment. The error is instead recorded in a new `error'
field, and a new SELECT_ERROR bit set.

Thanks Svante Signell for the initial version of the patch.

* hurd/hurdselect.c (SELECT_ERROR): New macro.
(_hurd_select):
- Add `error' field to `d' structures array.
- If a poll descriptor is bogus, set EBADF, but continue with a zero timeout.
- Go through the whole fd_set, not only until _hurd_dtablesize. Return EBADF
there is any bit set above _hurd_dtablesize.
- Do not request io_select on bogus descriptors (SELECT_ERROR).
- On io_select request error, record the error.
- On io_select bogus reply, use EIO error code.
- On io_select bogus or error reply, record the error.
- Do not destroy reply port for bogus FDs.
- On error, make poll set POLLHUP in the EPIPE case, POLLNVAL in the EBADF
case, or else POLLERR.
- On error, make select simulated readiness.

Gbp-Pq: Topic hurd-i386
Gbp-Pq: Name git-poll_errors_fixes.diff
hurd/hurdselect.c