1#include <stdint.h>
2#include <stdio.h>
3#include <stdlib.h>
4
5#include "fuzz.h"
6
7/**
8 * Main procedure for standalone fuzzing engine.
9 *
10 * Reads filenames from the argument array. For each filename, read the file
11 * into memory and then call the fuzzing interface with the data.
12 */
13int main(int argc, char **argv)
14{
15  int ii;
16  for(ii = 1; ii < argc; ii++)
17  {
18    FILE *infile;
19    printf("[%s] ", argv[ii]);
20
21    /* Try and open the file. */
22    infile = fopen(argv[ii], "rb");
23    if(infile)
24    {
25      uint8_t *buffer = NULL;
26      size_t buffer_len;
27
28      printf("Opened.. ");
29
30      /* Get the length of the file. */
31      fseek(infile, 0L, SEEK_END);
32      buffer_len = ftell(infile);
33
34      /* Reset the file indicator to the beginning of the file. */
35      fseek(infile, 0L, SEEK_SET);
36
37      /* Allocate a buffer for the file contents. */
38      buffer = (uint8_t *)calloc(buffer_len, sizeof(uint8_t));
39      if(buffer)
40      {
41        /* Read all the text from the file into the buffer. */
42        fread(buffer, sizeof(uint8_t), buffer_len, infile);
43        printf("Read %zu bytes, fuzzing.. ", buffer_len);
44
45        /* Call the fuzzer with the data. */
46        LLVMFuzzerTestOneInput(buffer, buffer_len);
47
48        printf("complete !!");
49
50        /* Free the buffer as it's no longer needed. */
51        free(buffer);
52        buffer = NULL;
53      }
54      else
55      {
56        fprintf(stderr,
57                "[%s] Failed to allocate %zu bytes \n",
58                argv[ii],
59                buffer_len);
60      }
61
62      /* Close the file as it's no longer needed. */
63      fclose(infile);
64      infile = NULL;
65    }
66    else
67    {
68      /* Failed to open the file. Maybe wrong name or wrong permissions? */
69      fprintf(stderr, "[%s] Open failed. \n", argv[ii]);
70    }
71
72    printf("\n");
73  }
74}
75