From eeb68ac561717496bedebc95128e7ae8e037dc1e Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Fri, 11 Aug 2023 11:09:12 +0800 Subject: [PATCH] fix mem-leaking when USB enumeration --- device/win_usb/usbview/devnode.c | 3 ++- device/win_usb/usbview/enum.c | 9 +++++++++ device/win_usb/usbview/enum.h | 16 +++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/device/win_usb/usbview/devnode.c b/device/win_usb/usbview/devnode.c index a832b98..e0e2a05 100644 --- a/device/win_usb/usbview/devnode.c +++ b/device/win_usb/usbview/devnode.c @@ -123,6 +123,7 @@ DriverNameToDeviceInst( { done = TRUE; *pDevInfo = deviceInfo; + deviceInfo = INVALID_HANDLE_VALUE; CopyMemory(pDevInfoData, &deviceInfoData, sizeof(deviceInfoData)); FREE(buf); break; @@ -137,7 +138,7 @@ DriverNameToDeviceInst( Done: - if (bResult == FALSE) + //if (bResult == FALSE) { if (deviceInfo != INVALID_HANDLE_VALUE) { diff --git a/device/win_usb/usbview/enum.c b/device/win_usb/usbview/enum.c index 1973b70..6ffc9a3 100644 --- a/device/win_usb/usbview/enum.c +++ b/device/win_usb/usbview/enum.c @@ -3807,7 +3807,16 @@ void free_usb_device_info(PUSBDEVICEINFO pudi) if (pudi->ConfigDesc) FREE(pudi->ConfigDesc); if (pudi->StringDescs) + { + PSTRING_DESCRIPTOR_NODE next = pudi->StringDescs->Next; FREE(pudi->StringDescs); + while (next) + { + pudi->StringDescs = next; + next = pudi->StringDescs->Next; + FREE(pudi->StringDescs); + } + } if (pudi->BosDesc) FREE(pudi->BosDesc); if (pudi->ConnectionInfoV2) diff --git a/device/win_usb/usbview/enum.h b/device/win_usb/usbview/enum.h index 3b37763..8f4b441 100644 --- a/device/win_usb/usbview/enum.h +++ b/device/win_usb/usbview/enum.h @@ -96,11 +96,11 @@ Revision History: #else -#define ALLOC(dwBytes) GlobalAlloc(GPTR,(dwBytes)) +#define ALLOC(dwBytes) allocate_mem(dwBytes) // GlobalAlloc(GPTR,(dwBytes)) -#define REALLOC(hMem, dwBytes) GlobalReAlloc((hMem), (dwBytes), (GMEM_MOVEABLE|GMEM_ZEROINIT)) +//#define REALLOC(hMem, dwBytes) GlobalReAlloc((hMem), (dwBytes), (GMEM_MOVEABLE|GMEM_ZEROINIT)) -#define FREE(hMem) GlobalFree((hMem)) +#define FREE(hMem) free(hMem) // GlobalFree((hMem)) #define CHECKFORLEAKS() @@ -111,6 +111,16 @@ Revision History: #define STR_INVALID_POWER_STATE "(invalid state) " #define STR_UNKNOWN_CONTROLLER_FLAVOR "Unknown" +FORCEINLINE void* allocate_mem(size_t len) +{ + void* mem = malloc(len); + + if (mem) + memset(mem, 0, len); + + return mem; +} + FORCEINLINE VOID InitializeListHead(