DragonFlyBSD Kernel Audit
DF-0212 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/kern/lwkt_serialize.c b/sys/kern/lwkt_serialize.c
--- a/sys/kern/lwkt_serialize.c
+++ b/sys/kern/lwkt_serialize.c
@@ -197,6 +197,14 @@
     if (atomic_intr_handler_is_enabled(&s->interlock) == 0) {
 	logslz(try, s);
 	if (atomic_intr_cond_try(&s->interlock) == 0) {
+	    /* Re-check the handler-enabled bit after acquiring, to close
+	     * the window between the pre-acquire check and a concurrent
+	     * handler_disable().  Matches lwkt_serialize_handler_call(). */
+	    if (atomic_intr_handler_is_enabled(&s->interlock) != 0) {
+		atomic_intr_cond_exit(&s->interlock, lwkt_serialize_wakeup, s);
+		logslz(tryfail, s);
+		return(1);
+	    }
 	    s->last_td = curthread;
 	    logslz(tryok, s);