Commit 96628339 authored by mmoroz's avatar mmoroz Committed by Commit bot

[fuzzer] Add input validation in the beginning of the parser fuzz target.

Non-printable characters do not make sense.
Inputs with non balanced brackets are mostly useless as well.

This validation function makes the fuzzer 15-20x faster.

Also use -only_ascii=1 option of libFuzzer:
https://codereview.chromium.org/2875933003

BUG=chromium:584819

Review-Url: https://codereview.chromium.org/2881583002
Cr-Commit-Position: refs/heads/master@{#45367}
parent 97984699
......@@ -14,7 +14,51 @@
#include "src/parsing/preparser.h"
#include "test/fuzzer/fuzzer-support.h"
#include <cctype>
#include <list>
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]))) {
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)) {
return 0;
}
v8_fuzzer::FuzzerSupport* support = v8_fuzzer::FuzzerSupport::Get();
v8::Isolate* isolate = support->GetIsolate();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment