From 776ec62dfc2cd394a298f03dbf27a96506544410 Mon Sep 17 00:00:00 2001 From: Alan Ott Date: Tue, 23 Apr 2013 13:50:59 -0400 Subject: [PATCH] windows: Fix leak of event handle on open_device() failure Create a new free_hid_device() function which takes care of all the resources in hid_device which may need to be freed/released. Reported-by: Johan Lindh --- windows/hid.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/windows/hid.c b/windows/hid.c index 17a1a2d..cd9e4bb 100755 --- a/windows/hid.c +++ b/windows/hid.c @@ -151,6 +151,14 @@ static hid_device *new_hid_device() return dev; } +static void free_hid_device(hid_device *dev) +{ + CloseHandle(dev->ol.hEvent); + CloseHandle(dev->device_handle); + LocalFree(dev->last_error_str); + free(dev->read_buf); + free(dev); +} static void register_error(hid_device *device, const char *op) { @@ -581,8 +589,7 @@ HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) err_pp_data: HidD_FreePreparsedData(pp_data); err: - CloseHandle(dev->device_handle); - free(dev); + free_hid_device(dev); return NULL; } @@ -783,11 +790,7 @@ void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) if (!dev) return; CancelIo(dev->device_handle); - CloseHandle(dev->ol.hEvent); - CloseHandle(dev->device_handle); - LocalFree(dev->last_error_str); - free(dev->read_buf); - free(dev); + free_hid_device(dev); } int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen)