summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
inline | side by side (from parent 1:
83d38ed)
The SCPI get routines may allocate memory for response data which
callers have to free after use.
The approach to release allocated memory is simlar or identical to the
corresponding parts of pull request 95, in an attempt to get the reported
leak fixes in, yet reduce the potential for conflicts where this commit
deviates from the PR. Most work was done by Ralf. Thank you!
This addresses part of bug #1683.
Submitted-By: Reported-By: Ralf <redacted>
Tested-By: Reported-By: Ralf <redacted>
*/
static int rigol_ds_event_wait(const struct sr_dev_inst *sdi, char status1, char status2)
{
*/
static int rigol_ds_event_wait(const struct sr_dev_inst *sdi, char status1, char status2)
{
struct dev_context *devc;
time_t start;
struct dev_context *devc;
time_t start;
if (sr_scpi_get_string(sdi->conn, ":TRIG:STAT?", &buf) != SR_OK)
return SR_ERR;
if (sr_scpi_get_string(sdi->conn, ":TRIG:STAT?", &buf) != SR_OK)
return SR_ERR;
- } while (buf[0] == status1 || buf[0] == status2);
+ c = buf[0];
+ g_free(buf);
+ } while (c == status1 || c == status2);
if (sr_scpi_get_string(sdi->conn, ":TRIG:STAT?", &buf) != SR_OK)
return SR_ERR;
if (sr_scpi_get_string(sdi->conn, ":TRIG:STAT?", &buf) != SR_OK)
return SR_ERR;
- } while (buf[0] != status1 && buf[0] != status2);
+ c = buf[0];
+ g_free(buf);
+ } while (c != status1 && c != status2);
rigol_ds_set_wait_event(devc, WAIT_NONE);
}
rigol_ds_set_wait_event(devc, WAIT_NONE);
}
char *buf;
struct dev_context *devc;
time_t start;
char *buf;
struct dev_context *devc;
time_t start;
if (!(devc = sdi->priv))
return SR_ERR;
if (!(devc = sdi->priv))
return SR_ERR;
/* "READ,nnnn" (still working) or "IDLE,nnnn" (finished) */
if (sr_scpi_get_string(sdi->conn, ":WAV:STAT?", &buf) != SR_OK)
return SR_ERR;
/* "READ,nnnn" (still working) or "IDLE,nnnn" (finished) */
if (sr_scpi_get_string(sdi->conn, ":WAV:STAT?", &buf) != SR_OK)
return SR_ERR;
-
- if (parse_int(buf + 5, &len) != SR_OK)
+ ret = parse_int(buf + 5, &len);
+ g_free(buf);
+ if (ret != SR_OK)
return SR_ERR;
} while (buf[0] == 'R' && len < (1000 * 1000));
}
return SR_ERR;
} while (buf[0] == 'R' && len < (1000 * 1000));
}
gchar *trig_mode;
unsigned int num_channels, i, j;
int buffer_samples;
gchar *trig_mode;
unsigned int num_channels, i, j;
int buffer_samples;
if (!(devc = sdi->priv))
return SR_ERR;
if (!(devc = sdi->priv))
return SR_ERR;
return SR_ERR;
if (sr_scpi_get_string(sdi->conn, ":TRIG:MODE?", &trig_mode) != SR_OK)
return SR_ERR;
return SR_ERR;
if (sr_scpi_get_string(sdi->conn, ":TRIG:MODE?", &trig_mode) != SR_OK)
return SR_ERR;
- if (rigol_ds_config_set(sdi, ":TRIG:%s:SWE SING", trig_mode) != SR_OK)
+ ret = rigol_ds_config_set(sdi, ":TRIG:%s:SWE SING", trig_mode);
+ g_free(trig_mode);
+ if (ret != SR_OK)
return SR_ERR;
if (rigol_ds_config_set(sdi, ":RUN") != SR_OK)
return SR_ERR;
return SR_ERR;
if (rigol_ds_config_set(sdi, ":RUN") != SR_OK)
return SR_ERR;
/* Coupling. */
for (i = 0; i < devc->model->analog_channels; i++) {
cmd = g_strdup_printf(":CHAN%d:COUP?", i + 1);
/* Coupling. */
for (i = 0; i < devc->model->analog_channels; i++) {
cmd = g_strdup_printf(":CHAN%d:COUP?", i + 1);
+ g_free(devc->coupling[i]);
+ devc->coupling[i] = NULL;
res = sr_scpi_get_string(sdi->conn, cmd, &devc->coupling[i]);
g_free(cmd);
if (res != SR_OK)
res = sr_scpi_get_string(sdi->conn, cmd, &devc->coupling[i]);
g_free(cmd);
if (res != SR_OK)
sr_dbg("CH%d %s", i + 1, devc->coupling[i]);
/* Trigger source. */
sr_dbg("CH%d %s", i + 1, devc->coupling[i]);
/* Trigger source. */
+ g_free(devc->trigger_source);
+ devc->trigger_source = NULL;
if (sr_scpi_get_string(sdi->conn, ":TRIG:EDGE:SOUR?", &devc->trigger_source) != SR_OK)
return SR_ERR;
sr_dbg("Current trigger source %s", devc->trigger_source);
if (sr_scpi_get_string(sdi->conn, ":TRIG:EDGE:SOUR?", &devc->trigger_source) != SR_OK)
return SR_ERR;
sr_dbg("Current trigger source %s", devc->trigger_source);
sr_dbg("Current horizontal trigger position %g", devc->horiz_triggerpos);
/* Trigger slope. */
sr_dbg("Current horizontal trigger position %g", devc->horiz_triggerpos);
/* Trigger slope. */
+ g_free(devc->trigger_slope);
+ devc->trigger_slope = NULL;
if (sr_scpi_get_string(sdi->conn, ":TRIG:EDGE:SLOP?", &devc->trigger_slope) != SR_OK)
return SR_ERR;
sr_dbg("Current trigger slope %s", devc->trigger_slope);
if (sr_scpi_get_string(sdi->conn, ":TRIG:EDGE:SLOP?", &devc->trigger_slope) != SR_OK)
return SR_ERR;
sr_dbg("Current trigger slope %s", devc->trigger_slope);