From 593e07268bf173202181e837b43bd1225ff7d6b7 Mon Sep 17 00:00:00 2001 From: stansmith Date: Sat, 29 Aug 2009 00:39:47 +0000 Subject: [PATCH] [WINVERBS] Fix a memory leak. We need to free the port array, which is allocated separately from the device structure. Signed-off-by: Sean Hefty git-svn-id: svn://openib.tc.cornell.edu/gen1@2392 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- .../WOF2-1/core/winverbs/kernel/wv_device.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/branches/WOF2-1/core/winverbs/kernel/wv_device.c b/branches/WOF2-1/core/winverbs/kernel/wv_device.c index cd97ae05..9e2de59e 100644 --- a/branches/WOF2-1/core/winverbs/kernel/wv_device.c +++ b/branches/WOF2-1/core/winverbs/kernel/wv_device.c @@ -187,7 +187,7 @@ static ib_ca_attr_t *WvQueryCaAttributes(WV_DEVICE *pDevice) ib_status = pDevice->pVerbs->query_ca(pDevice->pDevice->hDevice, attr, &size, NULL); if (ib_status != IB_SUCCESS) { - ExFreePool(attr); + ExFreePoolWithTag(attr, 'acvw'); attr = NULL; } @@ -208,7 +208,7 @@ static NTSTATUS WvDeviceCreatePorts(WV_DEVICE *pDevice) } pDevice->PortCount = attr->num_ports; - ExFreePool(attr); + ExFreePoolWithTag(attr, 'acvw'); pDevice->pPorts = ExAllocatePoolWithTag(NonPagedPool, sizeof(WV_PORT) * pDevice->PortCount, 'cpvw'); @@ -367,6 +367,9 @@ static void WvDeviceFreePorts(WV_DEVICE *pDevice) WdfIoQueuePurgeSynchronously(pDevice->pPorts[i].Queue); WdfObjectDelete(pDevice->pPorts[i].Queue); } + if (pDevice->pPorts != NULL) { + ExFreePoolWithTag(pDevice->pPorts, 'cpvw'); + } } void WvDeviceFree(WV_DEVICE *pDevice) @@ -385,7 +388,7 @@ void WvDeviceFree(WV_DEVICE *pDevice) WvDeviceFreePorts(pDevice); WvProviderPut(pDevice->pProvider); - ExFreePool(pDevice); + ExFreePoolWithTag(pDevice, 'cdvw'); } void WvDeviceRemoveHandler(WV_DEVICE *pDevice) @@ -573,7 +576,7 @@ void WvDeviceQuery(WV_PROVIDER *pProvider, WDFREQUEST Request) WvConvertDevAttr(attr, ca_attr); outlen = sizeof(WV_IO_DEVICE_ATTRIBUTES); - ExFreePool(ca_attr); + ExFreePoolWithTag(ca_attr, 'acvw'); complete: WdfRequestCompleteWithInformation(Request, status, outlen); @@ -622,7 +625,7 @@ void WvDevicePortQuery(WV_PROVIDER *pProvider, WDFREQUEST Request) outlen = sizeof(WV_IO_PORT_ATTRIBUTES); free: - ExFreePool(ca_attr); + ExFreePoolWithTag(ca_attr, 'acvw'); complete: WdfRequestCompleteWithInformation(Request, status, outlen); } @@ -678,7 +681,7 @@ void WvDeviceGidQuery(WV_PROVIDER *pProvider, WDFREQUEST Request) } free: - ExFreePool(ca_attr); + ExFreePoolWithTag(ca_attr, 'acvw'); complete: WdfRequestCompleteWithInformation(Request, status, outlen); } @@ -734,7 +737,7 @@ void WvDevicePkeyQuery(WV_PROVIDER *pProvider, WDFREQUEST Request) } free: - ExFreePool(ca_attr); + ExFreePoolWithTag(ca_attr, 'acvw'); complete: WdfRequestCompleteWithInformation(Request, status, outlen); } -- 2.46.0