[ovs-dev] [PATCH v5] datapath-windows: Avoid BSOD when switch context is NULL

Sorin Vinturis svinturis at cloudbasesolutions.com
Tue Nov 18 08:15:38 UTC 2014


I came around a BSOD that happened when trying to access pidHashLock
from the gOvsSwitchContext, which was NULL. The stop happened in
OvsAcquirePidHashLock function.

To reproduce this BSOD, make sure the extension is enabled and running,
disable it and, after that, execute 'ovs-dpctl.exe show'. The BSOD is
triggered afterwards.

Signed-off-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
Reported-by: Sorin Vinturis <svinturis at cloudbasesolutions.com>
Reported-at: https://github.com/openvswitch/ovs-issues/issues/53
Acked-by: Eitan Eliahu <eliahue at vmware.com>
---
 datapath-windows/ovsext/Tunnel.c |  3 ++-
 datapath-windows/ovsext/User.c   | 13 +++++++++----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c
index b55a223..fed58f1 100644
--- a/datapath-windows/ovsext/Tunnel.c
+++ b/datapath-windows/ovsext/Tunnel.c
@@ -224,9 +224,10 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl,
     OvsCompletionList completionList;
     KIRQL irql;
     ULONG SendFlags = NDIS_SEND_FLAGS_SWITCH_DESTINATION_GROUP;
-    OVS_DATAPATH *datapath = &gOvsSwitchContext->datapath;
+    OVS_DATAPATH *datapath = NULL;
 
     ASSERT(gOvsSwitchContext);
+    datapath = &gOvsSwitchContext->datapath;
 
     /* Fill the tunnel key */
     status = OvsSlowPathDecapVxlan(pNbl, &tunnelKey);
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index fc27f7d..b67c78d 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -141,10 +141,15 @@ OvsCleanupPacketQueue(POVS_OPEN_INSTANCE instance)
         OvsFreeMemory(queue);
     }
 
-    /* Remove the instance from pidHashArray */
-    OvsAcquirePidHashLock();
-    OvsDelPidInstance(gOvsSwitchContext, instance->pid);
-    OvsReleasePidHashLock();
+    /* Verify if gOvsSwitchContext exists. */
+    OvsAcquireCtrlLock();
+    if (gOvsSwitchContext) {
+        /* Remove the instance from pidHashArray */
+        OvsAcquirePidHashLock();
+        OvsDelPidInstance(gOvsSwitchContext, instance->pid);
+        OvsReleasePidHashLock();
+    }
+    OvsReleaseCtrlLock();
 }
 
 NTSTATUS
-- 
1.9.0.msysgit.0



More information about the dev mailing list