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.
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->identifier);
g_free(vcd_ch);
g_free(vcd_ch->name);
g_free(vcd_ch->identifier);
g_free(vcd_ch);
inc = in->priv;
g_slist_free_full(inc->channels, free_channel);
inc = in->priv;
g_slist_free_full(inc->channels, free_channel);
g_free(inc->buffer);
inc->buffer = NULL;
g_free(inc->current_levels);
g_free(inc->buffer);
inc->buffer = NULL;
g_free(inc->current_levels);
struct context *inc = in->priv;
cleanup(in);
struct context *inc = in->priv;
cleanup(in);
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);
+