Line data Source code
1 : #include <assert.h>
2 : #include <stdint.h>
3 : #include <stdio.h>
4 : #include <stdlib.h>
5 : #include <string.h>
6 : #include <getopt.h>
7 :
8 : extern int LLVMFuzzerInitialize(int *argc, char ***argv);
9 : extern int LLVMFuzzerTestOneInput(const uint8_t *data_p, size_t size);
10 : extern unsigned int fuzz_minimal_input_size(void);
11 :
12 : #define INPUT_SIZE 4096
13 : static uint8_t input[INPUT_SIZE];
14 :
15 45254 : int main(int argc, char **argv)
16 : {
17 : size_t size;
18 45254 : FILE *fp = NULL;
19 :
20 45254 : setbuf(stdin, NULL);
21 45254 : setbuf(stdout, NULL);
22 :
23 : while ( 1 )
24 : {
25 : enum {
26 : OPT_MIN_SIZE,
27 : };
28 : static const struct option lopts[] = {
29 : { "min-input-size", no_argument, NULL, OPT_MIN_SIZE },
30 : { 0, 0, 0, 0 }
31 : };
32 45254 : int c = getopt_long_only(argc, argv, "", lopts, NULL);
33 :
34 45254 : if ( c == -1 )
35 45254 : break;
36 :
37 0 : switch ( c )
38 : {
39 : case OPT_MIN_SIZE:
40 0 : printf("%u\n", fuzz_minimal_input_size());
41 0 : exit(0);
42 : break;
43 :
44 : case '?':
45 : usage:
46 0 : printf("Usage: %s $FILE | [--min-input-size]\n", argv[0]);
47 0 : exit(-1);
48 : break;
49 :
50 : default:
51 0 : printf("Bad getopt return %d (%c)\n", c, c);
52 0 : exit(-1);
53 : break;
54 : }
55 : }
56 :
57 45254 : if ( optind == argc ) /* No positional parameters. Use stdin. */
58 0 : fp = stdin;
59 45254 : else if ( optind != (argc - 1) )
60 0 : goto usage;
61 :
62 45254 : if ( LLVMFuzzerInitialize(&argc, &argv) )
63 0 : exit(-1);
64 :
65 : #ifdef __AFL_HAVE_MANUAL_CONTROL
66 : __AFL_INIT();
67 :
68 : while ( __AFL_LOOP(1000) )
69 : #endif
70 : {
71 45254 : if ( fp != stdin ) /* If not using stdin, open the provided file. */
72 : {
73 45254 : fp = fopen(argv[optind], "rb");
74 45254 : if ( fp == NULL )
75 : {
76 0 : perror("fopen");
77 0 : exit(-1);
78 : }
79 : }
80 :
81 45254 : size = fread(input, 1, INPUT_SIZE, fp);
82 :
83 45254 : if ( ferror(fp) )
84 : {
85 0 : perror("fread");
86 0 : exit(-1);
87 : }
88 :
89 45254 : if ( !feof(fp) )
90 : {
91 1524 : printf("Input too large\n");
92 1524 : exit(-1);
93 : }
94 :
95 43730 : if ( fp != stdin )
96 : {
97 43730 : fclose(fp);
98 43730 : fp = NULL;
99 : }
100 :
101 43730 : LLVMFuzzerTestOneInput(input, size);
102 : }
103 :
104 43730 : return 0;
105 : }
106 :
107 : /*
108 : * Local variables:
109 : * mode: C
110 : * c-file-style: "BSD"
111 : * c-basic-offset: 4
112 : * indent-tabs-mode: nil
113 : * End:
114 : */
|