summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSorin Vinturis <svinturis@cloudbasesolutions.com>2014-11-19 07:16:32 +0000
committerGurucharan Shetty <gshetty@nicira.com>2014-11-20 07:18:23 -0800
commit3b60a203ed3a6ccc804c24468942db10d035a25a (patch)
tree9045dbecaf3f7daf46271a1a254490dbaafa76d7
parent25f44d58248cf4ef46303cf3c35fbd28a493b266 (diff)
downloadopenvswitch-3b60a203ed3a6ccc804c24468942db10d035a25a.tar.gz
datapath-windows: Avoid BSOD when switch context is NULL
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@cloudbasesolutions.com> Reported-by: Sorin Vinturis <svinturis@cloudbasesolutions.com> Reported-at: https://github.com/openvswitch/ovs-issues/issues/53 Acked-by: Eitan Eliahu <eliahue@vmware.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Gurucharan Shetty <gshetty@nicira.com>
-rw-r--r--datapath-windows/ovsext/Tunnel.c3
-rw-r--r--datapath-windows/ovsext/User.c13
2 files changed, 11 insertions, 5 deletions
diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c
index b55a223c6..fed58f1c3 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 96adb5c36..8473f98f3 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