DragonFlyBSD Kernel Audit
DF-1668 / fix.diff
← back to finding ↓ download raw
--- a/sys/dev/virtual/hyperv/vmbus/vmbus.c
+++ b/sys/dev/virtual/hyperv/vmbus/vmbus.c
@@ -1019,6 +1019,15 @@
 	hdr = (const struct vmbus_chanmsg_hdr *)msg->msg_data;
 
 	/* TODO */
-	if (hdr->chm_type == VMBUS_CHANMSG_TYPE_VERSION_RESP)
-		vmbus_msghc_wakeup(sc, msg);
-}
+	if (hdr->chm_type == VMBUS_CHANMSG_TYPE_VERSION_RESP) {
+		struct vmbus_msghc_ctx *mhc = sc->vmbus_msg_hc;
+		struct vmbus_msghc *mh = NULL;
+		if (mhc != NULL) {
+			lwkt_gettoken(&mhc->mhc_active_token);
+			mh = mhc->mhc_active;
+			lwkt_reltoken(&mhc->mhc_active_token);
+		}
+		if (mh != NULL)
+			vmbus_msghc_wakeup(sc, msg);
+	}
+}