Fix regressions in return events of poll() on TTYs.

As pointed out, POLLHUP should be generated, even if it hasn't been
specified on input. It is also not allowed to return both POLLOUT and
POLLHUP at the same time.

Reported by:	jilles
Approved by:	re (kib)
This commit is contained in:
Ed Schouten 2009-07-08 10:21:52 +00:00
parent 58a654f664
commit 6b53d5c0e7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=195444
2 changed files with 8 additions and 11 deletions

View File

@ -536,25 +536,23 @@ ttydev_poll(struct cdev *dev, int events, struct thread *td)
int error, revents = 0;
error = ttydev_enter(tp);
if (error) {
/* Don't return the error here, but the event mask. */
return (events &
(POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM));
}
if (error)
return ((events & (POLLIN|POLLRDNORM)) | POLLHUP);
if (events & (POLLIN|POLLRDNORM)) {
/* See if we can read something. */
if (ttydisc_read_poll(tp) > 0)
revents |= events & (POLLIN|POLLRDNORM);
}
if (events & (POLLOUT|POLLWRNORM)) {
if (tp->t_flags & TF_ZOMBIE) {
/* Hangup flag on zombie state. */
revents |= POLLHUP;
} else if (events & (POLLOUT|POLLWRNORM)) {
/* See if we can write something. */
if (ttydisc_write_poll(tp) > 0)
revents |= events & (POLLOUT|POLLWRNORM);
}
if (tp->t_flags & TF_ZOMBIE)
/* Hangup flag on zombie state. */
revents |= events & POLLHUP;
if (revents == 0) {
if (events & (POLLIN|POLLRDNORM))

View File

@ -409,8 +409,7 @@ ptsdev_poll(struct file *fp, int events, struct ucred *active_cred,
if (psc->pts_flags & PTS_FINISHED) {
/* Slave device is not opened. */
tty_unlock(tp);
return (events &
(POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM));
return ((events & (POLLIN|POLLRDNORM)) | POLLHUP);
}
if (events & (POLLIN|POLLRDNORM)) {