diff options
author | Steve Markgraf <steve@steve-m.de> | 2018-05-01 02:17:22 +0200 |
---|---|---|
committer | Steve Markgraf <steve@steve-m.de> | 2018-05-01 02:17:22 +0200 |
commit | dac9d8e3b72d77ec97a8dc6a782f30531e9da337 (patch) | |
tree | f3419b9b1cb4f389ac0b19a5c7908b1481715a16 /src | |
parent | 2ff73000f6364dcb25208e22ee6dc7b92b4767cb (diff) | |
download | osmo-fl2k-dac9d8e3b72d77ec97a8dc6a782f30531e9da337.tar.gz osmo-fl2k-dac9d8e3b72d77ec97a8dc6a782f30531e9da337.tar.bz2 osmo-fl2k-dac9d8e3b72d77ec97a8dc6a782f30531e9da337.zip |
lib: free zero-copy buffers in case of error
Signed-off-by: Steve Markgraf <steve@steve-m.de>
Diffstat (limited to 'src')
-rw-r--r-- | src/libosmo-fl2k.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/libosmo-fl2k.c b/src/libosmo-fl2k.c index 0f996d3..d9a6101 100644 --- a/src/libosmo-fl2k.c +++ b/src/libosmo-fl2k.c @@ -577,7 +577,10 @@ static int fl2k_alloc_submit_transfers(fl2k_dev_t *dev) dev->xfer[i] = libusb_alloc_transfer(0); dev->xfer_buf = malloc(dev->xfer_buf_num * sizeof(unsigned char *)); + memset(dev->xfer_buf, 0, dev->xfer_buf_num * sizeof(unsigned char *)); + dev->xfer_info = malloc(dev->xfer_buf_num * sizeof(fl2k_xfer_info_t)); + memset(dev->xfer_info, 0, dev->xfer_buf_num * sizeof(fl2k_xfer_info_t)); #if defined (__linux__) && LIBUSB_API_VERSION >= 0x01000105 fprintf(stderr, "Using %d zero-copy buffers\n", dev->xfer_buf_num); @@ -587,17 +590,27 @@ static int fl2k_alloc_submit_transfers(fl2k_dev_t *dev) dev->xfer_buf[i] = libusb_dev_mem_alloc(dev->devh, dev->xfer_buf_len); if (!dev->xfer_buf[i]) { - fprintf(stderr, "Failed to allocate zerocopy" - " buffer for transfer %d\n", - i); + fprintf(stderr, "Failed to allocate zero-copy " + "buffer for transfer %d\n", i); - // TODO: free dev_mem buffers again dev->use_zerocopy = 0; break; } } + + /* zero-copy buffer allocation failed (partially or completely) + * we need to free the buffers again if already allocated */ + if (!dev->use_zerocopy) { + for (i = 0; i < dev->xfer_buf_num; ++i) { + if (dev->xfer_buf[i]) + libusb_dev_mem_free(dev->devh, + dev->xfer_buf[i], + dev->xfer_buf_len); + } + } #endif + /* no zero-copy available, allocate buffers in userspace */ if (!dev->use_zerocopy) { for (i = 0; i < dev->xfer_buf_num; ++i) { dev->xfer_buf[i] = malloc(dev->xfer_buf_len); |