If the OVS extension is enabled, Driver Verifier will issue a BSOD due to memory leaks. This issue reproduces each time and the problem is in the filter attach routine when the switch context is initialized.
Signed-off-by: Sorin Vinturis <svintu...@cloudbasesolutions.com> Reported-by: Sorin Vinturis <svintu...@cloudbasesolutions.com> Reported-at: https://github.com/openvswitch/ovs-issues/issues/50 --- datapath-windows/ovsext/Switch.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/datapath-windows/ovsext/Switch.c b/datapath-windows/ovsext/Switch.c index f445500..f8e72ac 100644 --- a/datapath-windows/ovsext/Switch.c +++ b/datapath-windows/ovsext/Switch.c @@ -205,6 +205,7 @@ OvsCreateSwitch(NDIS_HANDLE ndisFilterHandle, status = OvsTunnelFilterInitialize(gOvsExtDriverObject); if (status != NDIS_STATUS_SUCCESS) { + OvsCleanupSwitchContext(switchContext); OvsFreeMemory(switchContext); goto create_switch_done; } @@ -254,14 +255,18 @@ OvsExtDetach(NDIS_HANDLE filterModuleContext) VOID OvsDeleteSwitch(POVS_SWITCH_CONTEXT switchContext) { - UINT32 dpNo = switchContext->dpNo; + UINT32 dpNo = (UINT32) -1; OVS_LOG_TRACE("Enter: switchContext:%p", switchContext); - OvsTunnelFilterUninitialize(gOvsExtDriverObject); - OvsClearAllSwitchVports(switchContext); - OvsCleanupSwitchContext(switchContext); - OvsFreeMemory(switchContext); + if (switchContext) + { + dpNo = switchContext->dpNo; + OvsTunnelFilterUninitialize(gOvsExtDriverObject); + OvsClearAllSwitchVports(switchContext); + OvsCleanupSwitchContext(switchContext); + OvsFreeMemory(switchContext); + } OVS_LOG_TRACE("Exit: deleted switch %p dpNo: %d", switchContext, dpNo); } @@ -432,9 +437,13 @@ OvsCleanupSwitchContext(POVS_SWITCH_CONTEXT switchContext) NdisFreeRWLock(switchContext->dispatchLock); NdisFreeSpinLock(&(switchContext->pidHashLock)); OvsFreeMemory(switchContext->ovsPortNameHashArray); + switchContext->ovsPortNameHashArray = NULL; OvsFreeMemory(switchContext->portIdHashArray); + switchContext->portIdHashArray = NULL; OvsFreeMemory(switchContext->portNoHashArray); + switchContext->portNoHashArray = NULL; OvsFreeMemory(switchContext->pidHashArray); + switchContext->pidHashArray = NULL; OvsDeleteFlowTable(&switchContext->datapath); OvsCleanupBufferPool(switchContext); OVS_LOG_TRACE("Exit: Delete switchContext: %p", switchContext); -- 1.9.0.msysgit.0 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev