X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/f77690c303b7bd05a04603e6383613020cfe1ce6..bbbfeb45132c9fdd5635b8ce2a58254cb7082461:/hmcfgusb.c diff --git a/hmcfgusb.c b/hmcfgusb.c index 9f02480..0bcb5ae 100644 --- a/hmcfgusb.c +++ b/hmcfgusb.c @@ -218,6 +218,7 @@ static void LIBUSB_CALL hmcfgusb_interrupt(struct libusb_transfer *transfer) if (cb_data && cb_data->dev && cb_data->dev->transfer) { libusb_free_transfer(cb_data->dev->transfer); cb_data->dev->transfer = NULL; + free(cb_data); } return; } @@ -225,7 +226,18 @@ static void LIBUSB_CALL hmcfgusb_interrupt(struct libusb_transfer *transfer) if (cb_data && cb_data->cb) { if (debug) hexdump(transfer->buffer, transfer->actual_length, "USB > "); - cb_data->cb(transfer->buffer, transfer->actual_length, cb_data->data); + + if (!cb_data->cb(transfer->buffer, transfer->actual_length, cb_data->data)) { + quit = EIO; + + if (cb_data && cb_data->dev && cb_data->dev->transfer) { + libusb_free_transfer(cb_data->dev->transfer); + cb_data->dev->transfer = NULL; + free(cb_data); + } + + return; + } } else { hexdump(transfer->buffer, transfer->actual_length, "> "); } @@ -235,6 +247,8 @@ static void LIBUSB_CALL hmcfgusb_interrupt(struct libusb_transfer *transfer) if (err != 0) { fprintf(stderr, "Can't re-submit transfer: %s\n", usb_strerror(err)); libusb_free_transfer(transfer); + cb_data->dev->transfer = NULL; + free(cb_data); } } @@ -271,6 +285,7 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) cb_data = malloc(sizeof(struct hmcfgusb_cb_data)); if (!cb_data) { perror("Can't allocate memory for hmcfgusb_cb_data"); + free(dev); return NULL; } @@ -283,6 +298,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) dev->transfer = hmcfgusb_prepare_int(devh, hmcfgusb_interrupt, cb_data); if (!dev->transfer) { fprintf(stderr, "Can't prepare async device io!\n"); + free(dev); + free(cb_data); return NULL; } @@ -290,6 +307,7 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) if (!usb_pfd) { fprintf(stderr, "Can't get FDset from libusb!\n"); free(dev); + free(cb_data); return NULL; } @@ -300,6 +318,8 @@ struct hmcfgusb_dev *hmcfgusb_init(hmcfgusb_cb_fn cb, void *data) dev->pfd = malloc(dev->n_usb_pfd * sizeof(struct pollfd)); if (!dev->pfd) { perror("Can't allocate memory for poll-fds"); + free(dev); + free(cb_data); return NULL; }