xref: /aosp_15_r20/external/capstone/suite/fuzz/driverbin.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi #include <stdint.h>
2*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
3*9a0e4156SSadaf Ebrahimi #include <stdio.h>
4*9a0e4156SSadaf Ebrahimi #include <dirent.h>
5*9a0e4156SSadaf Ebrahimi #include <unistd.h>
6*9a0e4156SSadaf Ebrahimi 
7*9a0e4156SSadaf Ebrahimi int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
8*9a0e4156SSadaf Ebrahimi 
main(int argc,char ** argv)9*9a0e4156SSadaf Ebrahimi int main(int argc, char** argv)
10*9a0e4156SSadaf Ebrahimi {
11*9a0e4156SSadaf Ebrahimi     FILE * fp;
12*9a0e4156SSadaf Ebrahimi     uint8_t Data[0x1000];
13*9a0e4156SSadaf Ebrahimi     size_t Size;
14*9a0e4156SSadaf Ebrahimi     DIR *d;
15*9a0e4156SSadaf Ebrahimi     struct dirent *dir;
16*9a0e4156SSadaf Ebrahimi     int r = 0;
17*9a0e4156SSadaf Ebrahimi 
18*9a0e4156SSadaf Ebrahimi     if (argc != 2) {
19*9a0e4156SSadaf Ebrahimi         return 1;
20*9a0e4156SSadaf Ebrahimi     }
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi     d = opendir(argv[1]);
23*9a0e4156SSadaf Ebrahimi     if (d == NULL) {
24*9a0e4156SSadaf Ebrahimi         printf("Invalid directory\n");
25*9a0e4156SSadaf Ebrahimi         return 2;
26*9a0e4156SSadaf Ebrahimi     }
27*9a0e4156SSadaf Ebrahimi     if (chdir(argv[1]) != 0) {
28*9a0e4156SSadaf Ebrahimi         closedir(d);
29*9a0e4156SSadaf Ebrahimi         printf("Invalid directory\n");
30*9a0e4156SSadaf Ebrahimi         return 2;
31*9a0e4156SSadaf Ebrahimi     }
32*9a0e4156SSadaf Ebrahimi 
33*9a0e4156SSadaf Ebrahimi     while((dir = readdir(d)) != NULL) {
34*9a0e4156SSadaf Ebrahimi         //opens the file, get its size, and reads it into a buffer
35*9a0e4156SSadaf Ebrahimi         if (dir->d_type != DT_REG) {
36*9a0e4156SSadaf Ebrahimi             continue;
37*9a0e4156SSadaf Ebrahimi         }
38*9a0e4156SSadaf Ebrahimi         //printf("Running %s\n", dir->d_name);
39*9a0e4156SSadaf Ebrahimi         fp = fopen(dir->d_name, "rb");
40*9a0e4156SSadaf Ebrahimi         if (fp == NULL) {
41*9a0e4156SSadaf Ebrahimi             r = 3;
42*9a0e4156SSadaf Ebrahimi             break;
43*9a0e4156SSadaf Ebrahimi         }
44*9a0e4156SSadaf Ebrahimi         if (fseek(fp, 0L, SEEK_END) != 0) {
45*9a0e4156SSadaf Ebrahimi             fclose(fp);
46*9a0e4156SSadaf Ebrahimi             r = 4;
47*9a0e4156SSadaf Ebrahimi             break;
48*9a0e4156SSadaf Ebrahimi         }
49*9a0e4156SSadaf Ebrahimi         Size = ftell(fp);
50*9a0e4156SSadaf Ebrahimi         if (Size == (size_t) -1) {
51*9a0e4156SSadaf Ebrahimi             fclose(fp);
52*9a0e4156SSadaf Ebrahimi             r = 5;
53*9a0e4156SSadaf Ebrahimi             break;
54*9a0e4156SSadaf Ebrahimi         } else if (Size > 0x1000) {
55*9a0e4156SSadaf Ebrahimi             fclose(fp);
56*9a0e4156SSadaf Ebrahimi             continue;
57*9a0e4156SSadaf Ebrahimi         }
58*9a0e4156SSadaf Ebrahimi         if (fseek(fp, 0L, SEEK_SET) != 0) {
59*9a0e4156SSadaf Ebrahimi             fclose(fp);
60*9a0e4156SSadaf Ebrahimi             r = 7;
61*9a0e4156SSadaf Ebrahimi             break;
62*9a0e4156SSadaf Ebrahimi         }
63*9a0e4156SSadaf Ebrahimi         if (fread(Data, Size, 1, fp) != 1) {
64*9a0e4156SSadaf Ebrahimi             fclose(fp);
65*9a0e4156SSadaf Ebrahimi             r = 8;
66*9a0e4156SSadaf Ebrahimi             break;
67*9a0e4156SSadaf Ebrahimi         }
68*9a0e4156SSadaf Ebrahimi 
69*9a0e4156SSadaf Ebrahimi         //lauch fuzzer
70*9a0e4156SSadaf Ebrahimi         LLVMFuzzerTestOneInput(Data, Size);
71*9a0e4156SSadaf Ebrahimi         fclose(fp);
72*9a0e4156SSadaf Ebrahimi     }
73*9a0e4156SSadaf Ebrahimi     closedir(d);
74*9a0e4156SSadaf Ebrahimi     return r;
75*9a0e4156SSadaf Ebrahimi }
76*9a0e4156SSadaf Ebrahimi 
77