]> sigrok.org Git - sigrok-cli.git/commitdiff
sigrok-cli: Fix two memory leaks in parse_probestring().
authorpoljar (Damir Jelić) <redacted>
Thu, 14 Nov 2013 19:01:18 +0000 (20:01 +0100)
committerBert Vermeulen <redacted>
Fri, 15 Nov 2013 08:49:01 +0000 (09:49 +0100)
This patch fixes two memory leaks if multiple probe names or probe ranges are
specified.

parsers.c

index 206e1d639940f6a042ed87b55704f958ab614456..e94041764c36bc5ccf7034a7afe6f16b611aefd7 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -73,25 +73,25 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring)
                                /* Need exactly two arguments. */
                                g_critical("Invalid probe syntax '%s'.", tokens[i]);
                                ret = SR_ERR;
                                /* Need exactly two arguments. */
                                g_critical("Invalid probe syntax '%s'.", tokens[i]);
                                ret = SR_ERR;
-                               break;
+                               goto range_fail;
                        }
 
                        b = strtol(range[0], &eptr, 10);
                        if (eptr == range[0] || *eptr != '\0') {
                                g_critical("Invalid probe '%s'.", range[0]);
                                ret = SR_ERR;
                        }
 
                        b = strtol(range[0], &eptr, 10);
                        if (eptr == range[0] || *eptr != '\0') {
                                g_critical("Invalid probe '%s'.", range[0]);
                                ret = SR_ERR;
-                               break;
+                               goto range_fail;
                        }
                        e = strtol(range[1], NULL, 10);
                        if (eptr == range[1] || *eptr != '\0') {
                                g_critical("Invalid probe '%s'.", range[1]);
                                ret = SR_ERR;
                        }
                        e = strtol(range[1], NULL, 10);
                        if (eptr == range[1] || *eptr != '\0') {
                                g_critical("Invalid probe '%s'.", range[1]);
                                ret = SR_ERR;
-                               break;
+                               goto range_fail;
                        }
                        if (b < 0 || b >= e) {
                                g_critical("Invalid probe range '%s'.", tokens[i]);
                                ret = SR_ERR;
                        }
                        if (b < 0 || b >= e) {
                                g_critical("Invalid probe range '%s'.", tokens[i]);
                                ret = SR_ERR;
-                               break;
+                               goto range_fail;
                        }
 
                        while (b <= e) {
                        }
 
                        while (b <= e) {
@@ -110,6 +110,10 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring)
                                probelist = g_slist_append(probelist, probe);
                                b++;
                        }
                                probelist = g_slist_append(probelist, probe);
                                b++;
                        }
+range_fail:
+                       if (range)
+                               g_strfreev(range);
+
                        if (ret != SR_OK)
                                break;
                } else {
                        if (ret != SR_OK)
                                break;
                } else {
@@ -133,13 +137,11 @@ GSList *parse_probestring(struct sr_dev_inst *sdi, const char *probestring)
                                probe->name = g_strdup(names[1]);
                        }
                        probelist = g_slist_append(probelist, probe);
                                probe->name = g_strdup(names[1]);
                        }
                        probelist = g_slist_append(probelist, probe);
+
+                       if (names)
+                               g_strfreev(names);
                }
        }
                }
        }
-       if (range)
-               g_strfreev(range);
-
-       if (names)
-               g_strfreev(names);
 
        if (ret != SR_OK) {
                g_slist_free(probelist);
 
        if (ret != SR_OK) {
                g_slist_free(probelist);