Fix dangling knote references.
authorvisa <visa@openbsd.org>
Tue, 7 Aug 2018 12:38:15 +0000 (12:38 +0000)
committervisa <visa@openbsd.org>
Tue, 7 Aug 2018 12:38:15 +0000 (12:38 +0000)
commit4c035d0786d583e0761a97aa87b27f8463a98730
tree81818542add485fd19ec60bbc35d0e5c6f2e02b9
parent3495a04b57a4c9e05453d4871380d8eebe69eacc
Fix dangling knote references.

kqueue_close() does not take into account that the kqueue instance may
have queued knotes. This can cause a use-after-free if new knotes are
enqueued on the kqueue as a result of file closing.

Correct the error by dequeueing each knote before freeing it.
Since r1.93 of kern_event.c, each kqueue instance has its knotes
in nonshared lists kq_knhash and kq_knlist, so kqueue_close() does
not have to skip other kqueues' knotes any longer. The code can be
simplified by using knote_remove() for clearing the knote lists.
The function uses knote_drop() which takes care of knote dequeueing.

Found and initial analysis by anton@
OK anton@, mpi@
sys/kern/kern_event.c