Revise EVFILT_EXCEPT filters
authorvisa <visa@openbsd.org>
Mon, 13 Dec 2021 14:56:55 +0000 (14:56 +0000)
committervisa <visa@openbsd.org>
Mon, 13 Dec 2021 14:56:55 +0000 (14:56 +0000)
Restrict the circumstances where EVFILT_EXCEPT filters trigger:
* when out-of-band data is present and NOTE_OOB is requested.
* when the channel is fully closed and consumer is poll(2).

This should clarify the logic and suppress events that kqueue-based
poll(2) does not except.

OK mpi@

sys/kern/sys_pipe.c
sys/kern/tty_pty.c
sys/kern/uipc_socket.c
sys/miscfs/fifofs/fifo_vnops.c

index fa103c6..3444841 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sys_pipe.c,v 1.132 2021/12/13 14:54:22 visa Exp $     */
+/*     $OpenBSD: sys_pipe.c,v 1.133 2021/12/13 14:56:55 visa Exp $     */
 
 /*
  * Copyright (c) 1996 John S. Dyson
@@ -1079,19 +1079,20 @@ int
 filt_pipeexcept_common(struct knote *kn, struct pipe *rpipe)
 {
        struct pipe *wpipe;
+       int active = 0;
 
        rw_assert_wrlock(rpipe->pipe_lock);
 
        wpipe = pipe_peer(rpipe);
 
-       if ((rpipe->pipe_state & PIPE_EOF) || wpipe == NULL) {
-               kn->kn_flags |= EV_EOF;
-               if (kn->kn_flags & __EV_POLL)
+       if (kn->kn_flags & __EV_POLL) {
+               if ((rpipe->pipe_state & PIPE_EOF) || wpipe == NULL) {
                        kn->kn_flags |= __EV_HUP;
-               return (1);
+                       active = 1;
+               }
        }
 
-       return (0);
+       return (active);
 }
 
 int
index bf213d2..f719155 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: tty_pty.c,v 1.110 2021/10/24 00:02:25 jsg Exp $       */
+/*     $OpenBSD: tty_pty.c,v 1.111 2021/12/13 14:56:55 visa Exp $      */
 /*     $NetBSD: tty_pty.c,v 1.33.4.1 1996/06/02 09:08:11 mrg Exp $     */
 
 /*
@@ -727,6 +727,7 @@ filt_ptcexcept(struct knote *kn, long hint)
 {
        struct pt_softc *pti = (struct pt_softc *)kn->kn_hook;
        struct tty *tp;
+       int active = 0;
 
        tp = pti->pt_tty;
 
@@ -736,18 +737,18 @@ filt_ptcexcept(struct knote *kn, long hint)
                    ((pti->pt_flags & PF_UCNTL) && pti->pt_ucntl)) {
                        kn->kn_fflags |= NOTE_OOB;
                        kn->kn_data = 1;
-                       return (1);
+                       active = 1;
                }
-               return (0);
        }
-       if (!ISSET(tp->t_state, TS_CARR_ON)) {
-               kn->kn_flags |= EV_EOF;
-               if (kn->kn_flags & __EV_POLL)
+
+       if (kn->kn_flags & __EV_POLL) {
+               if (!ISSET(tp->t_state, TS_CARR_ON)) {
                        kn->kn_flags |= __EV_HUP;
-               return (1);
+                       active = 1;
+               }
        }
 
-       return (0);
+       return (active);
 }
 
 const struct filterops ptcread_filtops = {
index 6c0b47a..2615019 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: uipc_socket.c,v 1.269 2021/11/11 16:35:09 mvs Exp $   */
+/*     $OpenBSD: uipc_socket.c,v 1.270 2021/12/13 14:56:55 visa Exp $  */
 /*     $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $        */
 
 /*
@@ -2263,14 +2263,13 @@ filt_soexcept_common(struct knote *kn, struct socket *so)
                        kn->kn_data -= so->so_oobmark;
                        rv = 1;
                }
-       } else if (so->so_state & SS_CANTRCVMORE) {
-               kn->kn_flags |= EV_EOF;
-               if (kn->kn_flags & __EV_POLL) {
-                       if (so->so_state & SS_ISDISCONNECTED)
-                               kn->kn_flags |= __EV_HUP;
+       }
+
+       if (kn->kn_flags & __EV_POLL) {
+               if (so->so_state & SS_ISDISCONNECTED) {
+                       kn->kn_flags |= __EV_HUP;
+                       rv = 1;
                }
-               kn->kn_fflags = so->so_error;
-               rv = 1;
        }
 
        return rv;
index 86b4486..d95f34e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: fifo_vnops.c,v 1.88 2021/12/13 14:54:22 visa Exp $    */
+/*     $OpenBSD: fifo_vnops.c,v 1.89 2021/12/13 14:56:55 visa Exp $    */
 /*     $NetBSD: fifo_vnops.c,v 1.18 1996/03/16 23:52:42 christos Exp $ */
 
 /*
@@ -708,13 +708,11 @@ filt_fifoexcept_common(struct knote *kn, struct socket *so)
 
        soassertlocked(so);
 
-       if (so->so_state & SS_CANTRCVMORE) {
-               kn->kn_flags |= EV_EOF;
-               if (kn->kn_flags & __EV_POLL) {
-                       if (so->so_state & SS_ISDISCONNECTED)
-                               kn->kn_flags |= __EV_HUP;
+       if (kn->kn_flags & __EV_POLL) {
+               if (so->so_state & SS_ISDISCONNECTED) {
+                       kn->kn_flags |= __EV_HUP;
+                       rv = 1;
                }
-               rv = 1;
        }
 
        return (rv);