suricata
onefile.c
Go to the documentation of this file.
1#include "suricata-common.h"
2
3int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
4
5static int runOneFile(const char *fname)
6{
7 // opens the file, get its size, and reads it into a buffer
8 uint8_t *data;
9 size_t size;
10 FILE *fp = fopen(fname, "rb");
11 if (fp == NULL) {
12 return 2;
13 }
14 if (fseek(fp, 0L, SEEK_END) != 0) {
15 fclose(fp);
16 return 2;
17 }
18 size = ftell(fp);
19 if (size == (size_t) -1) {
20 fclose(fp);
21 return 2;
22 }
23 if (fseek(fp, 0L, SEEK_SET) != 0) {
24 fclose(fp);
25 return 2;
26 }
27 data = malloc(size);
28 if (data == NULL) {
29 fclose(fp);
30 return 2;
31 }
32 if (fread(data, size, 1, fp) != 1) {
33 fclose(fp);
34 free(data);
35 return 2;
36 }
37
38 // launch fuzzer
39 LLVMFuzzerTestOneInput(data, size);
40 free(data);
41 fclose(fp);
42 return 0;
43}
44
45int main(int argc, char **argv)
46{
47 DIR *d;
48 struct dirent *dir;
49 int r;
50
51 if (argc != 2) {
52 return 1;
53 }
54#ifdef AFLFUZZ_PERSISTENT_MODE
55 while (__AFL_LOOP(1000)) {
56#endif /* AFLFUZZ_PERSISTENT_MODE */
57
58 d = opendir(argv[1]);
59 if (d == NULL) {
60 // run one file
61 r = runOneFile(argv[1]);
62 if (r != 0) {
63 return r;
64 }
65 } else {
66 // run every file in one directory
67 if (chdir(argv[1]) != 0) {
68 closedir(d);
69 printf("Invalid directory\n");
70 return 2;
71 }
72 while ((dir = readdir(d)) != NULL) {
73 if (dir->d_type != DT_REG) {
74 continue;
75 }
76 r = runOneFile(dir->d_name);
77 if (r != 0) {
78 return r;
79 }
80 }
81 closedir(d);
82 }
83#ifdef AFLFUZZ_PERSISTENT_MODE
84 }
85#endif /* AFLFUZZ_PERSISTENT_MODE */
86
87 return 0;
88}
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
int main(int argc, char **argv)
Definition onefile.c:45