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:
parent
76f712a73f
commit
4237ab9e5b
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue