From: Stefan BrĂ¼ns Date: Thu, 26 Nov 2015 03:29:28 +0000 (+0100) Subject: output: fix options memory leak X-Git-Tag: libsigrok-0.4.0~92 X-Git-Url: https://sigrok.org/gitweb/?a=commitdiff_plain;h=da3d141f04e9a17bd41c5adfb5c83369fe3759df;p=libsigrok.git output: fix options memory leak --- diff --git a/src/output/analog.c b/src/output/analog.c index 59f2f0af..5e6e4aca 100644 --- a/src/output/analog.c +++ b/src/output/analog.c @@ -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", diff --git a/src/output/srzip.c b/src/output/srzip.c index c101d3b2..787a2bab 100644 --- a/src/output/srzip.c +++ b/src/output/srzip.c @@ -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", diff --git a/src/output/wav.c b/src/output/wav.c index 507e0e77..14ef36df 100644 --- a/src/output/wav.c +++ b/src/output/wav.c @@ -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",