aboutsummaryrefslogtreecommitdiffstats
path: root/capstone/suite/fuzz/driverbin.c
diff options
context:
space:
mode:
Diffstat (limited to 'capstone/suite/fuzz/driverbin.c')
-rw-r--r--capstone/suite/fuzz/driverbin.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/capstone/suite/fuzz/driverbin.c b/capstone/suite/fuzz/driverbin.c
new file mode 100644
index 000000000..d5e3a0fcc
--- /dev/null
+++ b/capstone/suite/fuzz/driverbin.c
@@ -0,0 +1,88 @@
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <unistd.h>
+
+#include "platform.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
+
+int main(int argc, char** argv)
+{
+ FILE * fp;
+ uint8_t Data[0x1000];
+ size_t Size;
+ DIR *d;
+ struct dirent *dir;
+ int r = 0;
+ int i;
+
+ if (argc != 2) {
+ return 1;
+ }
+
+ d = opendir(argv[1]);
+ if (d == NULL) {
+ printf("Invalid directory\n");
+ return 2;
+ }
+ if (chdir(argv[1]) != 0) {
+ closedir(d);
+ printf("Invalid directory\n");
+ return 2;
+ }
+
+ while((dir = readdir(d)) != NULL) {
+ //opens the file, get its size, and reads it into a buffer
+ if (dir->d_type != DT_REG) {
+ continue;
+ }
+ printf("Running file %s ", dir->d_name);
+ fflush(stdout);
+ fp = fopen(dir->d_name, "rb");
+ if (fp == NULL) {
+ r = 3;
+ break;
+ }
+ if (fseek(fp, 0L, SEEK_END) != 0) {
+ fclose(fp);
+ r = 4;
+ break;
+ }
+ Size = ftell(fp);
+ if (Size == (size_t) -1) {
+ fclose(fp);
+ r = 5;
+ break;
+ } else if (Size > 0x1000) {
+ fclose(fp);
+ continue;
+ }
+ if (fseek(fp, 0L, SEEK_SET) != 0) {
+ fclose(fp);
+ r = 7;
+ break;
+ }
+ if (fread(Data, Size, 1, fp) != 1) {
+ fclose(fp);
+ r = 8;
+ break;
+ }
+ if (Size > 0) {
+ printf("command cstool %s\n", get_platform_cstoolname(Data[0]));
+ }
+ for (i=0; i<Size; i++) {
+ printf("%02x", Data[i]);
+ }
+ printf("\n");
+
+ //lauch fuzzer
+ LLVMFuzzerTestOneInput(Data, Size);
+ fclose(fp);
+ }
+ closedir(d);
+ printf("Ok : whole directory finished\n");
+ return r;
+}
+