blob: bfc4f6271a63decc4c314675ba918f511953933d [file] [log] [blame]
// 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