1// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <stddef.h>
6#include <stdint.h>
7#include <stdio.h>
8#include <stdlib.h>
9
10extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv);
11extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);
12
13int main(int argc, char* argv[]) {
14  if (LLVMFuzzerInitialize(&argc, &argv)) {
15    fprintf(stderr, "Failed to initialize fuzzer target\n");
16    return 1;
17  }
18
19  if (argc < 2) {
20    fprintf(stderr, "USAGE: %s <input>\n", argv[0]);
21    return 1;
22  }
23
24  FILE* input = fopen(argv[1], "rb");
25
26  if (!input) {
27    fprintf(stderr, "Failed to open '%s'\n", argv[1]);
28    return 1;
29  }
30
31  fseek(input, 0, SEEK_END);
32  long size = ftell(input);
33  fseek(input, 0, SEEK_SET);
34
35  uint8_t* data = reinterpret_cast<uint8_t*>(malloc(size));
36  if (!data) {
37    fclose(input);
38    fprintf(stderr, "Failed to allocate %ld bytes\n", size);
39    return 1;
40  }
41
42  size_t bytes_read = fread(data, 1, size, input);
43  fclose(input);
44
45  if (bytes_read != size) {
46    free(data);
47    fprintf(stderr, "Failed to read %s\n", argv[1]);
48    return 1;
49  }
50
51  int result = LLVMFuzzerTestOneInput(data, size);
52
53  free(data);
54
55  return result;
56}
57