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:
parent
58a654f664
commit
6b53d5c0e7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=195444
@ -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))
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user