datapath-windows: Avoid BSOD when no event queue found.
[cascardo/ovs.git] / datapath-windows / ovsext / Event.c
index 467771d..d38bc70 100644 (file)
@@ -16,8 +16,9 @@
 
 #include "precomp.h"
 
-#include "Datapath.h"
 #include "Switch.h"
+#include "User.h"
+#include "Datapath.h"
 #include "Vport.h"
 #include "Event.h"
 
 #include "Debug.h"
 
 LIST_ENTRY ovsEventQueue;
+static NDIS_SPIN_LOCK eventQueueLock;
 UINT32 ovsNumEventQueue;
 UINT32 ovsNumPollAll;
 
-extern PNDIS_SPIN_LOCK gOvsCtrlLock;
-
 NTSTATUS
 OvsInitEventQueue()
 {
     InitializeListHead(&ovsEventQueue);
+    NdisAllocateSpinLock(&eventQueueLock);
     return STATUS_SUCCESS;
 }
 
@@ -45,18 +46,19 @@ OvsCleanupEventQueue()
 {
     ASSERT(IsListEmpty(&ovsEventQueue));
     ASSERT(ovsNumEventQueue == 0);
+    NdisFreeSpinLock(&eventQueueLock);
 }
 
 static __inline VOID
 OvsAcquireEventQueueLock()
 {
-    NdisAcquireSpinLock(gOvsCtrlLock);
+    NdisAcquireSpinLock(&eventQueueLock);
 }
 
 static __inline VOID
 OvsReleaseEventQueueLock()
 {
-   NdisReleaseSpinLock(gOvsCtrlLock);
+   NdisReleaseSpinLock(&eventQueueLock);
 }
 
 /*
@@ -467,6 +469,11 @@ OvsWaitEventIoctl(PIRP irp,
     }
 
     queue = (POVS_EVENT_QUEUE)instance->eventQueue;
+    if (queue == NULL) {
+        OvsReleaseEventQueueLock();
+        OVS_LOG_TRACE("Exit: Event queue does not exist");
+        return STATUS_INVALID_PARAMETER;
+    }
     if (queue->pendingIrp) {
         OvsReleaseEventQueueLock();
         OVS_LOG_TRACE("Exit: Event queue already in pending state");