]> sigrok.org Git - libsigrok.git/blobdiff - src/input/vcd.c
input/vcd: abort VCD import when timestamp counts backwards
[libsigrok.git] / src / input / vcd.c
index 5051f0e37d8bb97b20c67dc8a50f88bb381050a3..b9e9497dc8baf07b65370329179a615d2c175531 100644 (file)
@@ -265,7 +265,7 @@ static gboolean parse_header(const struct sr_input *in, GString *buf)
        return status;
 }
 
-static int format_match(GHashTable *metadata)
+static int format_match(GHashTable *metadata, unsigned int *confidence)
 {
        GString *buf, *tmpbuf;
        gboolean status;
@@ -283,7 +283,11 @@ static int format_match(GHashTable *metadata)
        g_free(name);
        g_free(contents);
 
-       return status ? SR_OK : SR_ERR;
+       if (!status)
+               return SR_ERR;
+       *confidence = 1;
+
+       return SR_OK;
 }
 
 /* Send all accumulated bytes from inc->buffer. */
@@ -404,6 +408,10 @@ static void parse_contents(const struct sr_input *in, char *data)
                                inc->prev_timestamp = inc->skip;
                        } else if (timestamp == inc->prev_timestamp) {
                                /* Ignore repeated timestamps (e.g. sigrok outputs these) */
+                       } else if (timestamp < inc->prev_timestamp) {
+                               sr_err("Invalid timestamp: %" PRIu64 " (smaller than previous timestamp).", timestamp);
+                               inc->skip_until_end = TRUE;
+                               break;
                        } else {
                                if (inc->compress != 0 && timestamp - inc->prev_timestamp > inc->compress) {
                                        /* Compress long idle periods */
@@ -648,7 +656,7 @@ static const struct sr_option *get_options(void)
 SR_PRIV struct sr_input_module input_vcd = {
        .id = "vcd",
        .name = "VCD",
-       .desc = "Value Change Dump",
+       .desc = "Value Change Dump data",
        .exts = (const char*[]){"vcd", NULL},
        .metadata = { SR_INPUT_META_HEADER | SR_INPUT_META_REQUIRED },
        .options = get_options,