You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.1 KiB
77 lines
2.1 KiB
// 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((-1031 <= 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
|