Add a new incremental parsing API
Change-Id: I6b921766836d58df0281fb23b2add3f62a478e14
This commit is contained in:
76
webm_parser/fuzzing/webm_fuzzer.cc
Normal file
76
webm_parser/fuzzing/webm_fuzzer.cc
Normal file
@@ -0,0 +1,76 @@
|
||||
// Copyright (c) 2016 The WebM project authors. All Rights Reserved.
|
||||
//
|
||||
// Use of this source code is governed by a BSD-style license
|
||||
// that can be found in the LICENSE file in the root of the source
|
||||
// tree. An additional intellectual property rights grant can be found
|
||||
// in the file PATENTS. All contributing project authors may
|
||||
// be found in the AUTHORS file in the root of the source tree.
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <new>
|
||||
#include <vector>
|
||||
|
||||
#include "webm/buffer_reader.h"
|
||||
#include "webm/callback.h"
|
||||
#include "webm/file_reader.h"
|
||||
#include "webm/reader.h"
|
||||
#include "webm/status.h"
|
||||
#include "webm/webm_parser.h"
|
||||
|
||||
using webm::BufferReader;
|
||||
using webm::Callback;
|
||||
using webm::FileReader;
|
||||
using webm::Reader;
|
||||
using webm::Status;
|
||||
using webm::WebmParser;
|
||||
|
||||
static int Run(Reader* reader) {
|
||||
Callback callback;
|
||||
WebmParser parser;
|
||||
|
||||
#if WEBM_FUZZER_SEEK_FIRST
|
||||
parser.DidSeek();
|
||||
#endif
|
||||
|
||||
Status status(-1);
|
||||
try {
|
||||
status = parser.Feed(&callback, reader);
|
||||
} catch (std::bad_alloc&) {
|
||||
// Failed allocations are okay. MSan doesn't throw std::bad_alloc, but
|
||||
// someday it might.
|
||||
}
|
||||
|
||||
// BufferReader/FileReader should never return either of the following codes,
|
||||
// which means the parser never should too:
|
||||
assert(status.code != Status::kWouldBlock);
|
||||
assert(status.code != Status::kOkPartial);
|
||||
|
||||
// Only the following ranges have status codes defined:
|
||||
assert((-1030 <= status.code && status.code <= -1025) ||
|
||||
(-3 <= status.code && status.code <= 0));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data,
|
||||
std::size_t size) {
|
||||
BufferReader reader(std::vector<std::uint8_t>(data, data + size));
|
||||
return Run(&reader);
|
||||
}
|
||||
|
||||
#if __AFL_COMPILER
|
||||
int main(int argc, char* argv[]) {
|
||||
FILE* file = (argc == 2) ? std::fopen(argv[1], "rb")
|
||||
: std::freopen(nullptr, "rb", stdin);
|
||||
if (!file) {
|
||||
std::cerr << "File cannot be opened\n";
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
FileReader reader(file);
|
||||
return Run(&reader);
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user