Author: ed Date: Wed Jul 8 10:21:52 2009 New Revision: 195444 URL: http://svn.freebsd.org/changeset/base/195444
Log: 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) Modified: head/sys/kern/tty.c head/sys/kern/tty_pts.c Modified: head/sys/kern/tty.c ============================================================================== --- head/sys/kern/tty.c Wed Jul 8 10:16:16 2009 (r195443) +++ head/sys/kern/tty.c Wed Jul 8 10:21:52 2009 (r195444) @@ -536,25 +536,23 @@ ttydev_poll(struct cdev *dev, int events 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)) Modified: head/sys/kern/tty_pts.c ============================================================================== --- head/sys/kern/tty_pts.c Wed Jul 8 10:16:16 2009 (r195443) +++ head/sys/kern/tty_pts.c Wed Jul 8 10:21:52 2009 (r195444) @@ -409,8 +409,7 @@ ptsdev_poll(struct file *fp, int events, 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)) { _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"