summaryrefslogtreecommitdiff
path: root/tests/state_buf.direct.lll
diff options
context:
space:
mode:
Diffstat (limited to 'tests/state_buf.direct.lll')
-rw-r--r--tests/state_buf.direct.lll98
1 files changed, 98 insertions, 0 deletions
diff --git a/tests/state_buf.direct.lll b/tests/state_buf.direct.lll
new file mode 100644
index 0000000..a0085d6
--- /dev/null
+++ b/tests/state_buf.direct.lll
@@ -0,0 +1,98 @@
+/*
+ * 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();
+
+ return 0; // All went well.
+}