From 211fd7e506bfea5886e3db5bca57fac2851cd5bf Mon Sep 17 00:00:00 2001 From: Michael Gernoth Date: Wed, 13 Nov 2013 21:38:37 +0100 Subject: [PATCH] make sure to close the device and call libusb_exit() on errors in hmcfgusb_init() Thanks to Ralf (johann @ fhem-forum) for reporting and fixing this --- hmcfgusb.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/hmcfgusb.c b/hmcfgusb.c index d77c9d8..01a50b7 100644 --- a/hmcfgusb.c +++ b/hmcfgusb.c @@ -311,6 +311,7 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) devh = hmcfgusb_find(ID_VENDOR, ID_PRODUCT_BL); if (!devh) { fprintf(stderr, "Can't find/open hmcfgusb!\n"); + libusb_exit(NULL); return NULL; } bootloader = 1; @@ -319,6 +320,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) dev = malloc(sizeof(struct hmcfgusb_dev)); if (!dev) { perror("Can't allocate memory for hmcfgusb_dev"); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -331,6 +334,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) if (!cb_data) { perror("Can't allocate memory for hmcfgusb_cb_data"); free(dev); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -345,6 +350,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) fprintf(stderr, "Can't prepare async device io!\n"); free(dev); free(cb_data); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -353,6 +360,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) fprintf(stderr, "Can't get FDset from libusb!\n"); free(dev); free(cb_data); + libusb_close(devh); + libusb_exit(NULL); return NULL; } @@ -365,6 +374,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) perror("Can't allocate memory for poll-fds"); free(dev); free(cb_data); + libusb_close(devh); + libusb_exit(NULL); return NULL; } -- 2.39.2