Am 05.09.2014 19:11, schrieb Alexander Kurpiers: > I agree. I'd say we drop the whole patch 0006 and do it properly. I'll > have a look later.
Next try...
>From 9c1c84def213c95491575d16bc9adb332cee305a Mon Sep 17 00:00:00 2001 From: Alexander Kurpiers <[email protected]> Date: Sat, 6 Sep 2014 16:02:00 +0200 Subject: [PATCH] handle memory allocation failure _rtlsdr_alloc_async_buffers() can fail, handle gracefully. --- src/librtlsdr.c | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 11850e4..5b4ff71 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -1689,6 +1689,8 @@ int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx) return rtlsdr_read_async(dev, cb, ctx, 0, 0); } +static int _rtlsdr_free_async_buffers(rtlsdr_dev_t *dev); + static int _rtlsdr_alloc_async_buffers(rtlsdr_dev_t *dev) { unsigned int i; @@ -1697,19 +1699,49 @@ static int _rtlsdr_alloc_async_buffers(rtlsdr_dev_t *dev) return -1; if (!dev->xfer) { - dev->xfer = malloc(dev->xfer_buf_num * + dev->xfer = (struct libusb_transfer **)malloc(dev->xfer_buf_num * sizeof(struct libusb_transfer *)); - for(i = 0; i < dev->xfer_buf_num; ++i) + if (dev->xfer == NULL) + return -1; + + for(i = 0; i < dev->xfer_buf_num; ++i) { dev->xfer[i] = libusb_alloc_transfer(0); + + if (dev->xfer[i] == NULL) { + while (i>0) { + libusb_free_transfer(dev->xfer[--i]); + dev->xfer[i] = NULL; + } + free(dev->xfer); + dev->xfer = NULL; + return -1; + } + } } if (!dev->xfer_buf) { - dev->xfer_buf = malloc(dev->xfer_buf_num * + dev->xfer_buf = (unsigned char **)malloc(dev->xfer_buf_num * sizeof(unsigned char *)); + if (dev->xfer_buf == NULL) { + _rtlsdr_free_async_buffers(dev); + return -1; + } + + for(i = 0; i < dev->xfer_buf_num; ++i) { + dev->xfer_buf[i] = (unsigned char*)malloc(dev->xfer_buf_len); - for(i = 0; i < dev->xfer_buf_num; ++i) - dev->xfer_buf[i] = malloc(dev->xfer_buf_len); + if (dev->xfer_buf[i] == NULL) { + while(i>0) { + free(dev->xfer_buf[--i]); + dev->xfer_buf[i] = NULL; + } + free(dev->xfer_buf); + dev->xfer_buf = NULL; + _rtlsdr_free_async_buffers(dev); + return -1; + } + } } return 0; @@ -1761,9 +1793,6 @@ int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx, if (RTLSDR_INACTIVE != dev->async_status) return -2; - dev->async_status = RTLSDR_RUNNING; - dev->async_cancel = 0; - dev->cb = cb; dev->cb_ctx = ctx; @@ -1777,7 +1806,12 @@ int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx, else dev->xfer_buf_len = DEFAULT_BUF_LENGTH; - _rtlsdr_alloc_async_buffers(dev); + /* Check the error code. */ + if(_rtlsdr_alloc_async_buffers(dev) < 0) + return -1; + + dev->async_status = RTLSDR_RUNNING; + dev->async_cancel = 0; for(i = 0; i < dev->xfer_buf_num; ++i) { /* Sleep a little here. -- 1.9.4.msysgit.0
