From cdf3c36ea1351d879b2caa5b8a0e880b47dc084e Mon Sep 17 00:00:00 2001 From: John Sheu Date: Tue, 10 Jun 2014 15:09:06 -0700 Subject: Fix leak in failure path of libusb_get_max_packet_size() If libusb_get_max_packet_size() or libusb_get_max_iso_packet_size() fails to find the endpoint, it leaks the configuration descriptor. Fix this. Signed-off-by: John Sheu Signed-off-by: Hans de Goede --- libusb/core.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/libusb/core.c b/libusb/core.c index 7af20ce..f3d7ece 100644 --- a/libusb/core.c +++ b/libusb/core.c @@ -899,10 +899,14 @@ int API_EXPORTED libusb_get_max_packet_size(libusb_device *dev, } ep = find_endpoint(config, endpoint); - if (!ep) - return LIBUSB_ERROR_NOT_FOUND; + if (!ep) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } r = ep->wMaxPacketSize; + +out: libusb_free_config_descriptor(config); return r; } @@ -950,17 +954,21 @@ int API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev, } ep = find_endpoint(config, endpoint); - if (!ep) - return LIBUSB_ERROR_NOT_FOUND; + if (!ep) { + r = LIBUSB_ERROR_NOT_FOUND; + goto out; + } val = ep->wMaxPacketSize; ep_type = (enum libusb_transfer_type) (ep->bmAttributes & 0x3); - libusb_free_config_descriptor(config); r = val & 0x07ff; if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) r *= (1 + ((val >> 11) & 3)); + +out: + libusb_free_config_descriptor(config); return r; } -- cgit v1.2.3