siglent-sds: free memory that was allocated by SCPI get routines

The SCPI get routines may allocate memory for response data which
callers have to free after use.

The implemented approach is modelled after pull request 114 by
Matti Eiden, to get the leak fixes in while the PR is queued.

This addresses part of bug #1683.

Submitted-By: Matti Eiden <snaipperi@gmail.com>
This commit is contained in:
Gerhard Sittig 2021-05-16 14:54:48 +02:00
parent 4da62209dd
commit 70158398f3
1 changed files with 13 additions and 1 deletions

View File

@ -75,6 +75,7 @@ static int siglent_sds_event_wait(const struct sr_dev_inst *sdi)
if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK) if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
return SR_ERR; return SR_ERR;
sr_atoi(buf, &out); sr_atoi(buf, &out);
g_free(buf);
g_usleep(s); g_usleep(s);
} while (out == 0); } while (out == 0);
@ -100,6 +101,7 @@ static int siglent_sds_event_wait(const struct sr_dev_inst *sdi)
if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK) if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
return SR_ERR; return SR_ERR;
sr_atoi(buf, &out); sr_atoi(buf, &out);
g_free(buf);
g_usleep(s); g_usleep(s);
/* XXX /* XXX
* Now this loop condition looks suspicious! A bitwise * Now this loop condition looks suspicious! A bitwise
@ -168,6 +170,7 @@ SR_PRIV int siglent_sds_capture_start(const struct sr_dev_inst *sdi)
if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK) if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
return SR_ERR; return SR_ERR;
sr_atoi(buf, &out); sr_atoi(buf, &out);
g_free(buf);
if (out == DEVICE_STATE_TRIG_RDY) { if (out == DEVICE_STATE_TRIG_RDY) {
siglent_sds_set_wait_event(devc, WAIT_TRIGGER); siglent_sds_set_wait_event(devc, WAIT_TRIGGER);
} else if (out == DEVICE_STATE_DATA_TRIG_RDY) { } else if (out == DEVICE_STATE_DATA_TRIG_RDY) {
@ -217,6 +220,7 @@ SR_PRIV int siglent_sds_capture_start(const struct sr_dev_inst *sdi)
if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK) if (sr_scpi_get_string(sdi->conn, ":INR?", &buf) != SR_OK)
return SR_ERR; return SR_ERR;
sr_atoi(buf, &out); sr_atoi(buf, &out);
g_free(buf);
if (out == DEVICE_STATE_TRIG_RDY) { if (out == DEVICE_STATE_TRIG_RDY) {
siglent_sds_set_wait_event(devc, WAIT_TRIGGER); siglent_sds_set_wait_event(devc, WAIT_TRIGGER);
} else if (out == DEVICE_STATE_DATA_TRIG_RDY) { } else if (out == DEVICE_STATE_DATA_TRIG_RDY) {
@ -760,6 +764,8 @@ SR_PRIV int siglent_sds_get_dev_cfg(const struct sr_dev_inst *sdi)
/* Coupling. */ /* Coupling. */
for (i = 0; i < devc->model->analog_channels; i++) { for (i = 0; i < devc->model->analog_channels; i++) {
cmd = g_strdup_printf("C%d:CPL?", i + 1); cmd = g_strdup_printf("C%d:CPL?", i + 1);
g_free(devc->coupling[i]);
devc->coupling[i] = NULL;
res = sr_scpi_get_string(sdi->conn, cmd, &devc->coupling[i]); res = sr_scpi_get_string(sdi->conn, cmd, &devc->coupling[i]);
g_free(cmd); g_free(cmd);
if (res != SR_OK) if (res != SR_OK)
@ -813,6 +819,8 @@ SR_PRIV int siglent_sds_get_dev_cfg(const struct sr_dev_inst *sdi)
/* Trigger slope. */ /* Trigger slope. */
cmd = g_strdup_printf("%s:TRSL?", devc->trigger_source); cmd = g_strdup_printf("%s:TRSL?", devc->trigger_source);
g_free(devc->trigger_slope);
devc->trigger_slope = NULL;
res = sr_scpi_get_string(sdi->conn, cmd, &devc->trigger_slope); res = sr_scpi_get_string(sdi->conn, cmd, &devc->trigger_slope);
g_free(cmd); g_free(cmd);
if (res != SR_OK) if (res != SR_OK)
@ -886,12 +894,15 @@ SR_PRIV int siglent_sds_get_dev_cfg_horizontal(const struct sr_dev_inst *sdi)
g_free(cmd); g_free(cmd);
samplerate_scope = 0; samplerate_scope = 0;
fvalue = 0; fvalue = 0;
if (res != SR_OK) if (res != SR_OK) {
g_free(sample_points_string);
return SR_ERR; return SR_ERR;
}
if (g_strstr_len(sample_points_string, -1, "Mpts") != NULL) { if (g_strstr_len(sample_points_string, -1, "Mpts") != NULL) {
sample_points_string[strlen(sample_points_string) - 4] = '\0'; sample_points_string[strlen(sample_points_string) - 4] = '\0';
if (sr_atof_ascii(sample_points_string, &fvalue) != SR_OK) { if (sr_atof_ascii(sample_points_string, &fvalue) != SR_OK) {
sr_dbg("Invalid float converted from scope response."); sr_dbg("Invalid float converted from scope response.");
g_free(sample_points_string);
return SR_ERR; return SR_ERR;
} }
samplerate_scope = fvalue * 1000000; samplerate_scope = fvalue * 1000000;
@ -899,6 +910,7 @@ SR_PRIV int siglent_sds_get_dev_cfg_horizontal(const struct sr_dev_inst *sdi)
sample_points_string[strlen(sample_points_string) - 4] = '\0'; sample_points_string[strlen(sample_points_string) - 4] = '\0';
if (sr_atof_ascii(sample_points_string, &fvalue) != SR_OK) { if (sr_atof_ascii(sample_points_string, &fvalue) != SR_OK) {
sr_dbg("Invalid float converted from scope response."); sr_dbg("Invalid float converted from scope response.");
g_free(sample_points_string);
return SR_ERR; return SR_ERR;
} }
samplerate_scope = fvalue * 10000; samplerate_scope = fvalue * 10000;