X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/153e04b395bd05c23a8c65eca6425561d56e881e..bbbfeb45132c9fdd5635b8ce2a58254cb7082461:/hmcfgusb.c diff --git a/hmcfgusb.c b/hmcfgusb.c index bfe0369..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, "> "); } @@ -234,8 +246,9 @@ static void LIBUSB_CALL hmcfgusb_interrupt(struct libusb_transfer *transfer) err = libusb_submit_transfer(transfer); if (err != 0) { fprintf(stderr, "Can't re-submit transfer: %s\n", usb_strerror(err)); - free(transfer->buffer); libusb_free_transfer(transfer); + cb_data->dev->transfer = NULL; + free(cb_data); } } @@ -272,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; } @@ -284,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; } @@ -291,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; } @@ -301,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; }