sr: fx2lafw: Fix memory leaks in receive_transfer
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 <lars@metafoo.de>
This commit is contained in:
parent
9edfee3ee3
commit
eabf24035b
|
@ -706,6 +706,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
|
||||||
/* Fire off a new request. */
|
/* Fire off a new request. */
|
||||||
if (!(new_buf = g_try_malloc(4096))) {
|
if (!(new_buf = g_try_malloc(4096))) {
|
||||||
sr_err("fx2lafw: %s: new_buf malloc failed.", __func__);
|
sr_err("fx2lafw: %s: new_buf malloc failed.", __func__);
|
||||||
|
libusb_free_transfer(transfer);
|
||||||
return; /* TODO: SR_ERR_MALLOC */
|
return; /* TODO: SR_ERR_MALLOC */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -726,6 +727,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
|
||||||
*/
|
*/
|
||||||
abort_acquisition(ctx);
|
abort_acquisition(ctx);
|
||||||
}
|
}
|
||||||
|
g_free(cur_buf);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
empty_transfer_count = 0;
|
empty_transfer_count = 0;
|
||||||
|
@ -801,7 +803,6 @@ static void receive_transfer(struct libusb_transfer *transfer)
|
||||||
logic.unitsize = sample_width;
|
logic.unitsize = sample_width;
|
||||||
logic.data = cur_buf + trigger_offset_bytes;
|
logic.data = cur_buf + trigger_offset_bytes;
|
||||||
sr_session_send(ctx->session_dev_id, &packet);
|
sr_session_send(ctx->session_dev_id, &packet);
|
||||||
g_free(cur_buf);
|
|
||||||
|
|
||||||
ctx->num_samples += cur_sample_count;
|
ctx->num_samples += cur_sample_count;
|
||||||
if (ctx->limit_samples &&
|
if (ctx->limit_samples &&
|
||||||
|
@ -814,6 +815,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
|
||||||
* ratio-sized buffer.
|
* ratio-sized buffer.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
g_free(cur_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_dev_acquisition_start(int dev_index, void *cb_data)
|
static int hw_dev_acquisition_start(int dev_index, void *cb_data)
|
||||||
|
|
Loading…
Reference in New Issue