]> granicus.if.org Git - re2c/commitdiff
Skeleton: fixed initialization of maximal path length.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 3 Aug 2017 10:52:49 +0000 (11:52 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 3 Aug 2017 11:00:32 +0000 (12:00 +0100)
Broken by commit fffb5932ee52127e03b9f7f5ccca83a421d69061.

Path length were initialized with 0 instead 'DIST_ERROR', which caused
incorrect calculation of maximal path length. This in turn caused errors
in estimating the number of byted necessary to hold keys during data
generation in skeleton. The resulting keys were one-byte while maximal
path length was more than one byte, which (fortunately!) caused runtime
errors in skeleton programs.

Example of program that caused skeleton error:
    /*!re2c
        (@t [\x00] [^]{5,6})* {}
    */

The error was hidden for so long because in practice inputs that need
more than one-byte keys are rare, and fuzzer sets 'ulimit -t 10' when
running re2c, so most of such programs were simply aborted. Those that
were not aborted still had a chance of estimating key size correctly.

re2c/src/skeleton/maxpath.cc

index c609c215e27fddaedad1b6c0e5a6bc574319e205..8fada329276326b75dcc1ed9f73dc7439a5b2792 100644 (file)
@@ -54,7 +54,7 @@ static void calc_dist(
 uint32_t maxpath(const Skeleton &skel)
 {
        std::vector<uint8_t> loops(skel.nodes_count);
-       std::vector<uint32_t> dists(skel.nodes_count);
+       std::vector<uint32_t> dists(skel.nodes_count, DIST_ERROR);
        calc_dist(skel, loops, dists, 0);
        const uint32_t maxlen = dists[0];
        if (maxlen == DIST_MAX) {