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

Reply via email to