diff options
Diffstat (limited to 'tests/state_buf_multiple.direct.lll')
-rw-r--r-- | tests/state_buf_multiple.direct.lll | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/tests/state_buf_multiple.direct.lll b/tests/state_buf_multiple.direct.lll new file mode 100644 index 0000000..ee336a4 --- /dev/null +++ b/tests/state_buf_multiple.direct.lll @@ -0,0 +1,104 @@ +/* + * This file is part of flex. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. + */ + +%{ +/* A template scanner file to build "scanner.cc". + The scanner tests that we correctly initialize the state buffer + for long input buffers owned by code that calls yylex. + + This tests guards against reversions to CVE-2006-0459, + in particular when variable trailing context rules are used. + */ +#include <iostream> +#include <fstream> +#include <vector> + +#define ECHO +%} + +%option prefix="test" +%option noyywrap + +ID [_a-zA-Z]+[_0-9a-zA-Z]* + +BBC1 ([^(]*|"("[^(]*")") + +/** + * Balanced Bracketed Content. + * May not contain bracket, but if it does then it is balanced. + */ +BBC ({BBC1}*|"("{BBC1}*")") + +FPD "("{BBC}*")" + +%% + +{ID}/{FPD}\{ { + return 1234; +} + +%% + +std::vector<char> readFile(const char* filename) +{ + std::vector<char> contents; + std::ifstream in(filename, std::ios::in | std::ios::binary); + if (in) + { + in.seekg(0, std::ios::end); + size_t size = static_cast<size_t>(in.tellg()); + contents.resize(size + 2); + in.seekg(0, std::ios::beg); + in.read(contents.data(), size); + in.close(); + + contents[size + 0] = '\0'; + contents[size + 1] = '\0'; + } + else { + std::cerr << "*** Error: std::ifstream(" << filename << ") failed." << std::endl; + exit(-1); + } + return contents; +} + +int main(int argc, char** argv) +{ + if ( argc != 2 ) { + std::cerr << "*** Error: Must specify one filename." << std::endl; + exit(-1); + } + + std::vector<char> stm = readFile( argv[1] ); + test_scan_buffer(stm.data(), stm.size()); + + testlex(); + + std::vector<char> stm2(stm); + stm2.insert(stm2.end(), stm.begin(), stm.end()); + test_scan_buffer(stm2.data(), stm2.size()); + + testlex(); + + return 0; // All went well. +} |