aboutsummaryrefslogtreecommitdiff
path: root/afl-common.c
diff options
context:
space:
mode:
authorKhaled Yakdan <yakdan@code-intelligence.de>2019-08-01 14:22:48 +0200
committerKhaled Yakdan <yakdan@code-intelligence.de>2019-08-01 14:22:48 +0200
commitebf2c8caa590468e1eafbc257e44dc30af82e5f8 (patch)
tree2b277b9bde32b82c2cedf684869c96424baa005f /afl-common.c
parenta949b40d11956f34c51f4546412a73e0400d1ffc (diff)
parent7ca22cd552ff21ac0ef7cc1ab5e6e71912752a58 (diff)
downloadafl++-ebf2c8caa590468e1eafbc257e44dc30af82e5f8.tar.gz
Merge remote-tracking branch 'github/master' into custom_mutator
# Conflicts: # Makefile # afl-fuzz.c
Diffstat (limited to 'afl-common.c')
-rw-r--r--afl-common.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/afl-common.c b/afl-common.c
new file mode 100644
index 00000000..1c5e5bfe
--- /dev/null
+++ b/afl-common.c
@@ -0,0 +1,69 @@
+/*
+ gather some functions common to multiple executables
+
+ detect_file_args
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <strings.h>
+
+#include "debug.h"
+#include "alloc-inl.h"
+
+/* Detect @@ in args. */
+#ifndef __glibc__
+#include <unistd.h>
+#endif
+void detect_file_args(char** argv, u8* prog_in) {
+
+ u32 i = 0;
+#ifdef __GLIBC__
+ u8* cwd = getcwd(NULL, 0); /* non portable glibc extension */
+#else
+ u8* cwd;
+ char *buf;
+ long size = pathconf(".", _PC_PATH_MAX);
+ if ((buf = (char *)malloc((size_t)size)) != NULL) {
+ cwd = getcwd(buf, (size_t)size); /* portable version */
+ } else {
+ PFATAL("getcwd() failed");
+ }
+#endif
+
+ if (!cwd) PFATAL("getcwd() failed");
+
+ while (argv[i]) {
+
+ u8* aa_loc = strstr(argv[i], "@@");
+
+ if (aa_loc) {
+
+ u8 *aa_subst, *n_arg;
+
+ if (!prog_in) FATAL("@@ syntax is not supported by this tool.");
+
+ /* Be sure that we're always using fully-qualified paths. */
+
+ if (prog_in[0] == '/') aa_subst = prog_in;
+ else aa_subst = alloc_printf("%s/%s", cwd, prog_in);
+
+ /* Construct a replacement argv value. */
+
+ *aa_loc = 0;
+ n_arg = alloc_printf("%s%s%s", argv[i], aa_subst, aa_loc + 2);
+ argv[i] = n_arg;
+ *aa_loc = '@';
+
+ if (prog_in[0] != '/') ck_free(aa_subst);
+
+ }
+
+ i++;
+
+ }
+
+ free(cwd); /* not tracked */
+
+}
+