]> sigrok.org Git - libsigrok.git/commitdiff
output: fix options memory leak
authorStefan Brüns <redacted>
Thu, 26 Nov 2015 03:29:28 +0000 (04:29 +0100)
committerUwe Hermann <redacted>
Sun, 29 Nov 2015 00:13:58 +0000 (01:13 +0100)
src/output/analog.c
src/output/srzip.c
src/output/wav.c

index 59f2f0afab22330a71b9ca88024aa689ec6d2d59..5e6e4aca49280b6f9625c456860cac74316f6c14 100644 (file)
@@ -355,22 +355,6 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
        return SR_OK;
 }
 
-static int cleanup(struct sr_output *o)
-{
-       struct context *ctx;
-
-       if (!o || !o->sdi)
-               return SR_ERR_ARG;
-       ctx = o->priv;
-
-       g_ptr_array_free(ctx->channellist, 1);
-       g_free(ctx->fdata);
-       g_free(ctx);
-       o->priv = NULL;
-
-       return SR_OK;
-}
-
 static struct sr_option options[] = {
        { "digits", "Digits", "Digits to show", NULL, NULL },
        ALL_ZERO
@@ -389,6 +373,24 @@ static const struct sr_option *get_options(void)
        return options;
 }
 
+static int cleanup(struct sr_output *o)
+{
+       struct context *ctx;
+
+       if (!o || !o->sdi)
+               return SR_ERR_ARG;
+       ctx = o->priv;
+
+       g_ptr_array_free(ctx->channellist, 1);
+       g_variant_unref(options[0].def);
+       g_slist_free_full(options[0].values, (GDestroyNotify)g_variant_unref);
+       g_free(ctx->fdata);
+       g_free(ctx);
+       o->priv = NULL;
+
+       return SR_OK;
+}
+
 SR_PRIV struct sr_output_module output_analog = {
        .id = "analog",
        .name = "Analog",
index c101d3b263e42235a1e12be91b18977cedf7807a..787a2bab6f4a0be4c56051d8caa74e8fa97357e0 100644 (file)
@@ -296,18 +296,6 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
        return SR_OK;
 }
 
-static int cleanup(struct sr_output *o)
-{
-       struct out_context *outc;
-
-       outc = o->priv;
-       g_free(outc->filename);
-       g_free(outc);
-       o->priv = NULL;
-
-       return SR_OK;
-}
-
 static struct sr_option options[] = {
        ALL_ZERO
 };
@@ -320,6 +308,19 @@ static const struct sr_option *get_options(void)
        return options;
 }
 
+static int cleanup(struct sr_output *o)
+{
+       struct out_context *outc;
+
+       outc = o->priv;
+       g_variant_unref(options[0].def);
+       g_free(outc->filename);
+       g_free(outc);
+       o->priv = NULL;
+
+       return SR_OK;
+}
+
 SR_PRIV struct sr_output_module output_srzip = {
        .id = "srzip",
        .name = "srzip",
index 507e0e77b53700ad2e9ac71cac01b3730a008e34..14ef36df185c3b862529be98767dedb214943cd5 100644 (file)
@@ -338,6 +338,19 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p
        return SR_OK;
 }
 
+static struct sr_option options[] = {
+       { "scale", "Scale", "Scale values by factor", NULL, NULL },
+       ALL_ZERO
+};
+
+static const struct sr_option *get_options(void)
+{
+       if (!options[0].def)
+               options[0].def = g_variant_ref_sink(g_variant_new_double(0.0));
+
+       return options;
+}
+
 static int cleanup(struct sr_output *o)
 {
        struct out_context *outc;
@@ -345,6 +358,7 @@ static int cleanup(struct sr_output *o)
 
        outc = o->priv;
        g_slist_free(outc->channels);
+       g_variant_unref(options[0].def);
        for (i = 0; i < outc->num_channels; i++)
                g_free(outc->chanbuf[i]);
        g_free(outc->chanbuf_used);
@@ -355,19 +369,6 @@ static int cleanup(struct sr_output *o)
        return SR_OK;
 }
 
-static struct sr_option options[] = {
-       { "scale", "Scale", "Scale values by factor", NULL, NULL },
-       ALL_ZERO
-};
-
-static const struct sr_option *get_options(void)
-{
-       if (!options[0].def)
-               options[0].def = g_variant_ref_sink(g_variant_new_double(0.0));
-
-       return options;
-}
-
 SR_PRIV struct sr_output_module output_wav = {
        .id = "wav",
        .name = "WAV",