svn commit: r195444 - head/sys/kern
Ed Schouten
ed at FreeBSD.org
Wed Jul 8 10:21:53 UTC 2009
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)) {
More information about the svn-src-all
mailing list