1*103e46e4SHarish Mahendrakar // Copyright (c) 2016 The WebM project authors. All Rights Reserved.
2*103e46e4SHarish Mahendrakar //
3*103e46e4SHarish Mahendrakar // Use of this source code is governed by a BSD-style license
4*103e46e4SHarish Mahendrakar // that can be found in the LICENSE file in the root of the source
5*103e46e4SHarish Mahendrakar // tree. An additional intellectual property rights grant can be found
6*103e46e4SHarish Mahendrakar // in the file PATENTS. All contributing project authors may
7*103e46e4SHarish Mahendrakar // be found in the AUTHORS file in the root of the source tree.
8*103e46e4SHarish Mahendrakar #include <cassert>
9*103e46e4SHarish Mahendrakar #include <cstdint>
10*103e46e4SHarish Mahendrakar #include <cstdio>
11*103e46e4SHarish Mahendrakar #include <cstdlib>
12*103e46e4SHarish Mahendrakar #include <iostream>
13*103e46e4SHarish Mahendrakar #include <new>
14*103e46e4SHarish Mahendrakar #include <vector>
15*103e46e4SHarish Mahendrakar
16*103e46e4SHarish Mahendrakar #include "webm/buffer_reader.h"
17*103e46e4SHarish Mahendrakar #include "webm/callback.h"
18*103e46e4SHarish Mahendrakar #include "webm/file_reader.h"
19*103e46e4SHarish Mahendrakar #include "webm/reader.h"
20*103e46e4SHarish Mahendrakar #include "webm/status.h"
21*103e46e4SHarish Mahendrakar #include "webm/webm_parser.h"
22*103e46e4SHarish Mahendrakar
23*103e46e4SHarish Mahendrakar using webm::BufferReader;
24*103e46e4SHarish Mahendrakar using webm::Callback;
25*103e46e4SHarish Mahendrakar using webm::FileReader;
26*103e46e4SHarish Mahendrakar using webm::Reader;
27*103e46e4SHarish Mahendrakar using webm::Status;
28*103e46e4SHarish Mahendrakar using webm::WebmParser;
29*103e46e4SHarish Mahendrakar
Run(Reader * reader)30*103e46e4SHarish Mahendrakar static int Run(Reader* reader) {
31*103e46e4SHarish Mahendrakar Callback callback;
32*103e46e4SHarish Mahendrakar WebmParser parser;
33*103e46e4SHarish Mahendrakar
34*103e46e4SHarish Mahendrakar #if WEBM_FUZZER_SEEK_FIRST
35*103e46e4SHarish Mahendrakar parser.DidSeek();
36*103e46e4SHarish Mahendrakar #endif
37*103e46e4SHarish Mahendrakar
38*103e46e4SHarish Mahendrakar Status status(-1);
39*103e46e4SHarish Mahendrakar try {
40*103e46e4SHarish Mahendrakar status = parser.Feed(&callback, reader);
41*103e46e4SHarish Mahendrakar } catch (std::bad_alloc&) {
42*103e46e4SHarish Mahendrakar // Failed allocations are okay. MSan doesn't throw std::bad_alloc, but
43*103e46e4SHarish Mahendrakar // someday it might.
44*103e46e4SHarish Mahendrakar }
45*103e46e4SHarish Mahendrakar
46*103e46e4SHarish Mahendrakar // BufferReader/FileReader should never return either of the following codes,
47*103e46e4SHarish Mahendrakar // which means the parser never should too:
48*103e46e4SHarish Mahendrakar assert(status.code != Status::kWouldBlock);
49*103e46e4SHarish Mahendrakar assert(status.code != Status::kOkPartial);
50*103e46e4SHarish Mahendrakar
51*103e46e4SHarish Mahendrakar // Only the following ranges have status codes defined:
52*103e46e4SHarish Mahendrakar assert((-1031 <= status.code && status.code <= -1025) ||
53*103e46e4SHarish Mahendrakar (-3 <= status.code && status.code <= 0));
54*103e46e4SHarish Mahendrakar
55*103e46e4SHarish Mahendrakar return 0;
56*103e46e4SHarish Mahendrakar }
57*103e46e4SHarish Mahendrakar
LLVMFuzzerTestOneInput(const std::uint8_t * data,std::size_t size)58*103e46e4SHarish Mahendrakar extern "C" int LLVMFuzzerTestOneInput(const std::uint8_t* data,
59*103e46e4SHarish Mahendrakar std::size_t size) {
60*103e46e4SHarish Mahendrakar BufferReader reader(std::vector<std::uint8_t>(data, data + size));
61*103e46e4SHarish Mahendrakar return Run(&reader);
62*103e46e4SHarish Mahendrakar }
63*103e46e4SHarish Mahendrakar
64*103e46e4SHarish Mahendrakar #if __AFL_COMPILER
main(int argc,char * argv[])65*103e46e4SHarish Mahendrakar int main(int argc, char* argv[]) {
66*103e46e4SHarish Mahendrakar FILE* file = (argc == 2) ? std::fopen(argv[1], "rb")
67*103e46e4SHarish Mahendrakar : std::freopen(nullptr, "rb", stdin);
68*103e46e4SHarish Mahendrakar if (!file) {
69*103e46e4SHarish Mahendrakar std::cerr << "File cannot be opened\n";
70*103e46e4SHarish Mahendrakar return EXIT_FAILURE;
71*103e46e4SHarish Mahendrakar }
72*103e46e4SHarish Mahendrakar
73*103e46e4SHarish Mahendrakar FileReader reader(file);
74*103e46e4SHarish Mahendrakar return Run(&reader);
75*103e46e4SHarish Mahendrakar }
76*103e46e4SHarish Mahendrakar #endif
77