X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/hmcfgusb/blobdiff_plain/f16395dafd2efc188914cdbe0ca18148940bb66b..5e961a89167e50682e5ae87cf352a484de09ae64:/hmcfgusb.c diff --git a/hmcfgusb.c b/hmcfgusb.c index 1a6bb76..0bcb5ae 100644 --- a/hmcfgusb.c +++ b/hmcfgusb.c @@ -191,7 +191,6 @@ static struct libusb_transfer *hmcfgusb_prepare_int(libusb_device_handle *devh, if (err != 0) { fprintf(stderr, "Can't submit transfer: %s\n", usb_strerror(err)); libusb_free_transfer(transfer); - free(data_buf); return NULL; } @@ -219,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; } @@ -226,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,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); } } @@ -273,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; } @@ -285,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; } @@ -292,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; } @@ -302,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; }