From: Gerhard Sittig Date: Sun, 6 Nov 2016 11:08:02 +0000 (+0100) Subject: hameg-hmo: Release enabled channels when acquisition start fails X-Git-Tag: libsigrok-0.5.0~158 X-Git-Url: https://sigrok.org/gitweb/?a=commitdiff_plain;h=40a75c8e9732992e80e055c995edd73f1ff07f2a;hp=2d224dbae735e5d3ea39cbafcd6d280cbd112c31;p=libsigrok.git hameg-hmo: Release enabled channels when acquisition start fails Commit db81fbb58261 made sure to release a potentially previously allocated list of enabled channels before (re-)building the list in the current invocation of acquisition start. This commit frees the memory in the error path near the failed creation already, which reduces the period of time where unused resources are held, and eliminates a memory leak when acquisition is not stopped after failed start. Both approaches can coexist. Freeing an empty list is perfectly fine. --- diff --git a/src/hardware/hameg-hmo/api.c b/src/hardware/hameg-hmo/api.c index fe32262d..92f5ab67 100644 --- a/src/hardware/hameg-hmo/api.c +++ b/src/hardware/hameg-hmo/api.c @@ -705,6 +705,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) struct sr_channel *ch; struct dev_context *devc; struct sr_scpi_dev_inst *scpi; + int ret; if (sdi->status != SR_ST_ACTIVE) return SR_ERR_DEV_CLOSED; @@ -734,12 +735,14 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) if (hmo_check_channels(devc->enabled_channels) != SR_OK) { sr_err("Invalid channel configuration specified!"); - return SR_ERR_NA; + ret = SR_ERR_NA; + goto free_enabled; } if (hmo_setup_channels(sdi) != SR_OK) { sr_err("Failed to setup channel configuration!"); - return SR_ERR; + ret = SR_ERR; + goto free_enabled; } sr_scpi_source_add(sdi->session, scpi, G_IO_IN, 50, @@ -750,6 +753,11 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) devc->current_channel = devc->enabled_channels; return hmo_request_data(sdi); + +free_enabled: + g_slist_free(devc->enabled_channels); + devc->enabled_channels = NULL; + return ret; } static int dev_acquisition_stop(struct sr_dev_inst *sdi)