Ensure that filt_dead() takes effect
authorvisa <visa@openbsd.org>
Wed, 23 Dec 2020 13:59:09 +0000 (13:59 +0000)
committervisa <visa@openbsd.org>
Wed, 23 Dec 2020 13:59:09 +0000 (13:59 +0000)
Invoke dead_filtops' f_event callback in klist_invalidate() to ensure
that filt_dead() modifies every invalidated knote. If a knote has
EV_ONESHOT set in its event flags, kqueue_scan() will not call f_event.

OK mpi@

sys/kern/kern_event.c

index 71613f4..b8641e7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_event.c,v 1.154 2020/12/23 13:53:44 visa Exp $   */
+/*     $OpenBSD: kern_event.c,v 1.155 2020/12/23 13:59:09 visa Exp $   */
 
 /*-
  * Copyright (c) 1999,2000,2001 Jonathan Lemon <jlemon@FreeBSD.org>
@@ -1620,6 +1620,7 @@ klist_invalidate(struct klist *list)
                kn->kn_fop->f_detach(kn);
                if (kn->kn_fop->f_flags & FILTEROP_ISFD) {
                        kn->kn_fop = &dead_filtops;
+                       kn->kn_fop->f_event(kn, 0);
                        knote_activate(kn);
                        s = splhigh();
                        knote_release(kn);