]> sigrok.org Git - sigrok-cli.git/blobdiff - sigrok-cli.c
sigrok-cli.c: Fix memory leak in parsing of hardware options
[sigrok-cli.git] / sigrok-cli.c
index 16e0bee10becd77baa00a08c68853c6b127afb0d..70d3a59ee6cc2c3517c21baa84469619a129e255 100644 (file)
@@ -140,6 +140,12 @@ static GSList *hash_to_hwopt(GHashTable *hash)
        return opts;
 }
 
+static void free_hwopt(struct sr_hwopt *hwopt)
+{
+       g_free((void *)hwopt->value);
+       g_free(hwopt);
+}
+
 static GSList *device_scan(void)
 {
        struct sr_dev_driver **drivers, *driver;
@@ -174,6 +180,7 @@ static GSList *device_scan(void)
                                /* Unknown options, already logged. */
                                return NULL;
                devices = sr_driver_scan(driver, drvopts);
+               g_slist_free_full(drvopts, (GDestroyNotify)free_hwopt);
        } else {
                /* No driver specified, let them all scan on their own. */
                devices = NULL;
@@ -196,7 +203,7 @@ static GSList *device_scan(void)
 
 static void show_version(void)
 {
-       GSList *l;
+       const GSList *l;
        struct sr_dev_driver **drivers;
        struct sr_input_format **inputs;
        struct sr_output_format **outputs;
@@ -440,7 +447,7 @@ static void show_dev_detail(void)
                                printf("      %s\n", stropts[i]);
 
                } else if (hwo->hwcap == SR_HWCAP_FILTER) {
-                       /* Supported trigger sources */
+                       /* Supported filters */
                        printf("    %s", hwo->shortname);
                        if (sr_info_get(sdi->driver, SR_DI_FILTERS,
                                        (const void **)&stropts, sdi) != SR_OK) {
@@ -544,18 +551,14 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
 {
        static struct sr_output *o = NULL;
        static int logic_probelist[SR_MAX_NUM_PROBES] = { -1 };
-       static struct sr_probe *analog_probelist[SR_MAX_NUM_PROBES];
        static uint64_t received_samples = 0;
        static int unitsize = 0;
        static int triggered = 0;
        static FILE *outfile = NULL;
-       static int num_analog_probes = 0;
        struct sr_probe *probe;
        const struct sr_datafeed_logic *logic;
        const struct sr_datafeed_meta_logic *meta_logic;
        const struct sr_datafeed_analog *analog;
-       const struct sr_datafeed_meta_analog *meta_analog;
-       static int num_enabled_analog_probes = 0;
        int num_enabled_probes, sample_size, ret, i;
        uint64_t output_len, filter_out_len;
        uint8_t *output_buf, *filter_out;
@@ -719,14 +722,6 @@ static void datafeed_in(const struct sr_dev_inst *sdi,
 
        case SR_DF_META_ANALOG:
                g_message("cli: Received SR_DF_META_ANALOG");
-               meta_analog = packet->payload;
-               num_analog_probes = meta_analog->num_probes;
-               num_enabled_analog_probes = 0;
-               for (i = 0; i < num_analog_probes; i++) {
-                       probe = g_slist_nth_data(sdi->probes, i);
-                       if (probe->enabled)
-                               analog_probelist[num_enabled_analog_probes++] = probe;
-               }
 
                outfile = stdout;
                if (opt_output_file) {
@@ -1288,8 +1283,6 @@ static int set_dev_options(struct sr_dev_inst *sdi, GHashTable *args)
                        g_critical("Failed to set device option '%s'.", (char *)key);
                        return ret;
                }
-               else
-                       break;
        }
 
        return SR_OK;