⬢ DragonFlyBSD Kernel Audit
DF-4300 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/misc/vkbd/vkbd.c
+++ b/sys/dev/misc/vkbd/vkbd.c
@@ -304,11 +304,14 @@ vkbd_dev_close(struct dev_close_args *ap)
 	VKBD_LOCK(state);
 
 	/* wait for interrupt task */
-	while (state->ks_flags & TASK)
-		VKBD_SLEEP(state, ks_task, "vkbdc", 0);
+	while (state->ks_flags & TASK) {
+		tsleep_interlock(&state->ks_task);
+		if (!(state->ks_flags & TASK))
+			break;
+		VKBD_SLEEP(state, ks_task, "vkbdc", 0);
+	}