]> granicus.if.org Git - re2c/commitdiff
Skeleton: generate proper keys for tags.
authorUlya Trofimovich <skvadrik@gmail.com>
Fri, 18 Nov 2016 16:29:09 +0000 (16:29 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Fri, 18 Nov 2016 16:29:09 +0000 (16:29 +0000)
Instead of calculating all necessary keys, then attributing keys
of the first path to all paths, write proper keys for each path.

Found by slyfox's fuzzer. :)

re2c/src/ir/skeleton/generate_data.cc

index 0b8db187a7193bd4abfbfc9a8f5ec5ec144cdfbe..b14c5f43e079a21a8942fe3c8452f5a6f88ba3e4 100644 (file)
@@ -199,16 +199,14 @@ static void write_keys(const path_t &path, const Skeleton &skel,
        // keys: 1 - scanned length, 2 - matched length, 3 - matched rule, the rest - tags
        const size_t nkey = 3 + htag - ltag;
        key_t *keys = new key_t[nkey * width], *k = keys;
-       // 1st path
-       *k++ = to_le(static_cast<key_t>(path.len()));
-       *k++ = to_le(static_cast<key_t>(matched));
-       *k++ = to_le(rule2key<key_t>(rule, skel.defrule));
-       for (size_t t = ltag; t < htag; ++t) {
-               *k++ = to_le(static_cast<key_t>(tags[vers[t]]));
-       }
-       // remaining paths: copy-paste keys from 1st path
-       for (size_t w = 1; w < width; ++w, k += nkey) {
-               memcpy(k, keys, nkey * sizeof(key_t));
+       for (size_t w = 0; w < width; ++w) {
+               *k++ = to_le(static_cast<key_t>(path.len()));
+               *k++ = to_le(static_cast<key_t>(matched));
+               *k++ = to_le(rule2key<key_t>(rule, skel.defrule));
+               const size_t *ts = &tags[w * nver];
+               for (size_t t = ltag; t < htag; ++t) {
+                       *k++ = to_le(static_cast<key_t>(ts[vers[t]]));
+               }
        }
        // dump to file
        fwrite(keys, sizeof(key_t), nkey * width, file);