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.
This commit is contained in:
Gerhard Sittig 2018-10-12 11:07:12 +02:00 committed by Uwe Hermann
parent 76f712a73f
commit 4237ab9e5b
1 changed files with 14 additions and 2 deletions

View File

@ -151,7 +151,11 @@ static gboolean parse_section(GString *buf, gchar **name, gchar **contents)
static void free_channel(void *data) 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->name);
g_free(vcd_ch->identifier); g_free(vcd_ch->identifier);
g_free(vcd_ch); g_free(vcd_ch);
@ -615,6 +619,7 @@ static void cleanup(struct sr_input *in)
inc = in->priv; inc = in->priv;
g_slist_free_full(inc->channels, free_channel); g_slist_free_full(inc->channels, free_channel);
inc->channels = NULL;
g_free(inc->buffer); g_free(inc->buffer);
inc->buffer = NULL; inc->buffer = NULL;
g_free(inc->current_levels); g_free(inc->current_levels);
@ -626,9 +631,16 @@ static int reset(struct sr_input *in)
struct context *inc = in->priv; struct context *inc = in->priv;
cleanup(in); cleanup(in);
inc->started = FALSE;
g_string_truncate(in->buf, 0); 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; return SR_OK;
} }