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"

Reply via email to