| // 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 |