Darwin: Fix #65 memory leak in submit_iso_transfer() This was also independently fixed by Hoi-Ho Chan, but Thomas caught an additional problem with his fix. This commit came via OpenKinect into libusb thanks to Kyle Machulis and Hector Martin.
diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c index 4bd13d4..9121dd1 100644 --- a/libusb/os/darwin_usb.c +++ b/libusb/os/darwin_usb.c
@@ -1182,10 +1182,18 @@ /* are we reading or writing? */ is_read = transfer->endpoint & LIBUSB_ENDPOINT_IN; - /* construct an array of IOUSBIsocFrames */ - tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame)); - if (!tpriv->isoc_framelist) - return LIBUSB_ERROR_NO_MEM; + /* construct an array of IOUSBIsocFrames, reuse the old one if possible */ + if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) { + free(tpriv->isoc_framelist); + tpriv->isoc_framelist = NULL; + } + + if (!tpriv->isoc_framelist) { + tpriv->num_iso_packets = transfer->num_iso_packets; + tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame)); + if (!tpriv->isoc_framelist) + return LIBUSB_ERROR_NO_MEM; + } /* copy the frame list from the libusb descriptor (the structures differ only is member order) */ for (i = 0 ; i < transfer->num_iso_packets ; i++)
diff --git a/libusb/os/darwin_usb.h b/libusb/os/darwin_usb.h index a71d464..dc14ed6 100644 --- a/libusb/os/darwin_usb.h +++ b/libusb/os/darwin_usb.h
@@ -146,6 +146,7 @@ struct darwin_transfer_priv { /* Isoc */ IOUSBIsocFrame *isoc_framelist; + size_t num_iso_packets; /* Control */ #if !defined (LIBUSB_NO_TIMEOUT_DEVICE)