From 4237ab9e5ba85153b632b43b7eb2411530e11df8 Mon Sep 17 00:00:00 2001 From: Gerhard Sittig Date: Fri, 12 Oct 2018 11:07:12 +0200 Subject: [PATCH] input/vcd: Expand the reset() logic This addresses part of bug #1306. The reset() method of the VCD input module was incomplete, and did not process new data upon second read. Improve robustness and add missing reset instructions. Void invalid pointers and avoid NULL dereferences in cleanup paths. --- src/input/vcd.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/input/vcd.c b/src/input/vcd.c index b9e9497d..95092cb2 100644 --- a/src/input/vcd.c +++ b/src/input/vcd.c @@ -151,7 +151,11 @@ static gboolean parse_section(GString *buf, gchar **name, gchar **contents) static void free_channel(void *data) { - struct vcd_channel *vcd_ch = data; + struct vcd_channel *vcd_ch; + + vcd_ch = data; + if (!vcd_ch) + return; g_free(vcd_ch->name); g_free(vcd_ch->identifier); g_free(vcd_ch); @@ -615,6 +619,7 @@ static void cleanup(struct sr_input *in) inc = in->priv; g_slist_free_full(inc->channels, free_channel); + inc->channels = NULL; g_free(inc->buffer); inc->buffer = NULL; g_free(inc->current_levels); @@ -626,9 +631,16 @@ static int reset(struct sr_input *in) struct context *inc = in->priv; cleanup(in); - inc->started = FALSE; g_string_truncate(in->buf, 0); + inc->started = FALSE; + inc->got_header = FALSE; + inc->prev_timestamp = 0; + inc->skip_until_end = FALSE; + inc->channelcount = 0; + /* The inc->channels list was released in cleanup() above. */ + inc->buffer = g_malloc(CHUNK_SIZE); + return SR_OK; }