summaryrefslogtreecommitdiffstats
path: root/src/tests/fuzz/onefile.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 17:39:49 +0000
commita0aa2307322cd47bbf416810ac0292925e03be87 (patch)
tree37076262a026c4b48c8a0e84f44ff9187556ca35 /src/tests/fuzz/onefile.c
parentInitial commit. (diff)
downloadsuricata-a0aa2307322cd47bbf416810ac0292925e03be87.tar.xz
suricata-a0aa2307322cd47bbf416810ac0292925e03be87.zip
Adding upstream version 1:7.0.3.upstream/1%7.0.3
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/tests/fuzz/onefile.c')
-rw-r--r--src/tests/fuzz/onefile.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/tests/fuzz/onefile.c b/src/tests/fuzz/onefile.c
new file mode 100644
index 0000000..344ef8e
--- /dev/null
+++ b/src/tests/fuzz/onefile.c
@@ -0,0 +1,88 @@
+#include "suricata-common.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
+
+static int runOneFile(const char *fname)
+{
+ // opens the file, get its size, and reads it into a buffer
+ uint8_t *data;
+ size_t size;
+ FILE *fp = fopen(fname, "rb");
+ if (fp == NULL) {
+ return 2;
+ }
+ if (fseek(fp, 0L, SEEK_END) != 0) {
+ fclose(fp);
+ return 2;
+ }
+ size = ftell(fp);
+ if (size == (size_t) -1) {
+ fclose(fp);
+ return 2;
+ }
+ if (fseek(fp, 0L, SEEK_SET) != 0) {
+ fclose(fp);
+ return 2;
+ }
+ data = malloc(size);
+ if (data == NULL) {
+ fclose(fp);
+ return 2;
+ }
+ if (fread(data, size, 1, fp) != 1) {
+ fclose(fp);
+ free(data);
+ return 2;
+ }
+
+ // launch fuzzer
+ LLVMFuzzerTestOneInput(data, size);
+ free(data);
+ fclose(fp);
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ DIR *d;
+ struct dirent *dir;
+ int r;
+
+ if (argc != 2) {
+ return 1;
+ }
+#ifdef AFLFUZZ_PERSISTENT_MODE
+ while (__AFL_LOOP(1000)) {
+#endif /* AFLFUZZ_PERSISTENT_MODE */
+
+ d = opendir(argv[1]);
+ if (d == NULL) {
+ // run one file
+ r = runOneFile(argv[1]);
+ if (r != 0) {
+ return r;
+ }
+ } else {
+ // run every file in one directory
+ if (chdir(argv[1]) != 0) {
+ closedir(d);
+ printf("Invalid directory\n");
+ return 2;
+ }
+ while ((dir = readdir(d)) != NULL) {
+ if (dir->d_type != DT_REG) {
+ continue;
+ }
+ r = runOneFile(dir->d_name);
+ if (r != 0) {
+ return r;
+ }
+ }
+ closedir(d);
+ }
+#ifdef AFLFUZZ_PERSISTENT_MODE
+ }
+#endif /* AFLFUZZ_PERSISTENT_MODE */
+
+ return 0;
+}