]> sigrok.org Git - libsigrok.git/commitdiff
sr: fx2lafw: Fix memory leaks in receive_transfer
authorLars-Peter Clausen <redacted>
Thu, 21 Jun 2012 08:30:39 +0000 (10:30 +0200)
committerUwe Hermann <redacted>
Fri, 22 Jun 2012 07:23:30 +0000 (09:23 +0200)
There are a few memory leaks in the receive_transfer transfer function. The most
serve of them is that a sample buffer is not freed if the triggered has not
matched yet, which causes a sigrok process which is waiting for a trigger to
consume several megabytes of memory within seconds. The other leaks are on the
error paths in that function.

Signed-off-by: Lars-Peter Clausen <redacted>
hardware/fx2lafw/fx2lafw.c

index aa8331f182b3d24905b104fbbc769df18a4454a5..6b184b70d8f9ff0178dca18f1aa49b3609a7dd08 100644 (file)
@@ -706,6 +706,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
        /* Fire off a new request. */
        if (!(new_buf = g_try_malloc(4096))) {
                sr_err("fx2lafw: %s: new_buf malloc failed.", __func__);
+               libusb_free_transfer(transfer);
                return; /* TODO: SR_ERR_MALLOC */
        }
 
@@ -726,6 +727,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
                         */
                        abort_acquisition(ctx);
                }
+               g_free(cur_buf);
                return;
        } else {
                empty_transfer_count = 0;
@@ -801,7 +803,6 @@ static void receive_transfer(struct libusb_transfer *transfer)
                logic.unitsize = sample_width;
                logic.data = cur_buf + trigger_offset_bytes;
                sr_session_send(ctx->session_dev_id, &packet);
-               g_free(cur_buf);
 
                ctx->num_samples += cur_sample_count;
                if (ctx->limit_samples &&
@@ -814,6 +815,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
                 * ratio-sized buffer.
                 */
        }
+       g_free(cur_buf);
 }
 
 static int hw_dev_acquisition_start(int dev_index, void *cb_data)