Index: test/fuzzer/parser.cc |
diff --git a/test/fuzzer/parser.cc b/test/fuzzer/parser.cc |
index 5870d9cb3b62873c1126c7cfce54c493d3037e5e..b3c3c6ac17cf5d03b988256977f8321b769f4403 100644 |
--- a/test/fuzzer/parser.cc |
+++ b/test/fuzzer/parser.cc |
@@ -14,7 +14,52 @@ |
#include "src/parsing/preparser.h" |
#include "test/fuzzer/fuzzer-support.h" |
+#include <list> |
+#include <cctype> |
+ |
+bool IsValidInput(const uint8_t* data, size_t size) { |
+ std::list<char> parentheses; |
+ const char* ptr = reinterpret_cast<const char*>(data); |
+ |
+ for (size_t i = 0; i != size; ++i) { |
+ // Check that all characters in the data are valid. |
+ if (!(std::isspace(ptr[i]) || std::isprint(ptr[i]))) |
marja
2017/05/17 08:56:20
Coding style nit: if the body is on the next line,
mmoroz
2017/05/17 09:59:15
Done.
|
+ return false; |
+ |
+ // Check balance of parentheses in the data. |
+ switch (ptr[i]) { |
+ case '(': |
+ case '[': |
+ case '{': |
+ parentheses.push_back(ptr[i]); |
+ break; |
+ case ')': |
+ if (parentheses.back() != '(') |
+ return false; |
+ parentheses.pop_back(); |
+ break; |
+ case ']': |
+ if (parentheses.back() != '[') |
+ return false; |
+ parentheses.pop_back(); |
+ break; |
+ case '}': |
+ if (parentheses.back() != '{') |
+ return false; |
+ parentheses.pop_back(); |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ |
+ return parentheses.empty(); |
+} |
+ |
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
+ if (!IsValidInput(data, size)) |
marja
2017/05/17 08:56:20
ditto
mmoroz
2017/05/17 09:59:15
Done.
|
+ return 0; |
+ |
v8_fuzzer::FuzzerSupport* support = v8_fuzzer::FuzzerSupport::Get(); |
v8::Isolate* isolate = support->GetIsolate(); |