portability fix: getcwd(NULL, 0) is a non-POSIX glibc extension. Refactor
detect_file_args() in a separate file in order to avoid multiple copies.
MODIFY
Makefile
Makefile
@@ -131,20 +131,23 @@ afl-as: afl-as.c afl-as.h $(COMM_HDR) | test_x86
$(CC) $(CFLAGS) $@.c -o $@ $(LDFLAGS)
ln -sf afl-as as
+afl-common.o : afl-common.c
+ $(CC) $(CFLAGS) -c afl-common.c
+
sharedmem.o : sharedmem.c
$(CC) $(CFLAGS) -c sharedmem.c
afl-fuzz: afl-fuzz.c sharedmem.o $(COMM_HDR) | test_x86
- $(CC) $(CFLAGS) $@.c sharedmem.o -o $@ $(LDFLAGS) $(PYFLAGS)
+ $(CC) $(CFLAGS) $@.c afl-common.o sharedmem.o -o $@ $(LDFLAGS) $(PYFLAGS)
afl-showmap: afl-showmap.c sharedmem.o $(COMM_HDR) | test_x86
- $(CC) $(CFLAGS) $@.c sharedmem.o -o $@ $(LDFLAGS)
+ $(CC) $(CFLAGS) $@.c afl-common.o sharedmem.o -o $@ $(LDFLAGS)
afl-tmin: afl-tmin.c sharedmem.o $(COMM_HDR) | test_x86
- $(CC) $(CFLAGS) $@.c sharedmem.o -o $@ $(LDFLAGS)
+ $(CC) $(CFLAGS) $@.c afl-common.o sharedmem.o -o $@ $(LDFLAGS)
afl-analyze: afl-analyze.c sharedmem.o $(COMM_HDR) | test_x86
- $(CC) $(CFLAGS) $@.c sharedmem.o -o $@ $(LDFLAGS)
+ $(CC) $(CFLAGS) $@.c afl-common.o sharedmem.o -o $@ $(LDFLAGS)
afl-gotcpu: afl-gotcpu.c $(COMM_HDR) | test_x86
$(CC) $(CFLAGS) $@.c -o $@ $(LDFLAGS)

MODIFY
afl-analyze.c
afl-analyze.c
#include "alloc-inl.h"
#include "hash.h"
#include "sharedmem.h"
+#include "afl-common.h"
#include <stdio.h>
#include <unistd.h>
@@ -725,48 +726,6 @@ static void setup_signal_handlers(void) {
}
-/* Detect @@ in args. */
-
-static void detect_file_args(char** argv) {
-
- u32 i = 0;
- u8* cwd = getcwd(NULL, 0);
-
- if (!cwd) PFATAL("getcwd() failed");
-
- while (argv[i]) {
-
- u8* aa_loc = strstr(argv[i], "@@");
-
- if (aa_loc) {
-
- u8 *aa_subst, *n_arg;
-
- /* 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 */
-
-}
-
-
/* Display usage hints. */
static void usage(u8* argv0) {
@@ -1018,7 +977,7 @@ int main(int argc, char** argv) {
set_up_environment();
find_binary(argv[optind]);
- detect_file_args(argv + optind);
+ detect_file_args(argv + optind, prog_in);
if (qemu_mode)
use_argv = get_qemu_argv(argv[0], argv + optind, argc - optind);

ADD
afl-common.c
+/*
+ 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 */
+
+}
+

ADD
afl-common.h
+#ifndef __AFLCOMMON_H
+#define __AFLCOMMON_H
+
+void detect_file_args(char **argv, u8 *prog_in);
+#endif

MODIFY
afl-fuzz.c
afl-fuzz.c
#include "alloc-inl.h"
#include "hash.h"
#include "sharedmem.h"
+#include "afl-common.h"
#include <stdio.h>
#include <unistd.h>
@@ -8068,58 +8069,6 @@ static void check_asan_opts(void) {
}
-/* Detect @@ in args. */
-
-EXP_ST void detect_file_args(char** argv) {
-
- u32 i = 0;
- u8* cwd = getcwd(NULL, 0);
-
- if (!cwd) PFATAL("getcwd() failed");
-
- while (argv[i]) {
-
- u8* aa_loc = strstr(argv[i], "@@");
-
- if (aa_loc) {
-
- u8 *aa_subst, *n_arg;
-
- /* If we don't have a file name chosen yet, use a safe default. */
-
- if (!out_file) {
- if (file_extension) {
- out_file = alloc_printf("%s/.cur_input.%s", out_dir, file_extension);
- } else {
- out_file = alloc_printf("%s/.cur_input", out_dir);
- }
- }
-
- /* Be sure that we're always using fully-qualified paths. */
-
- if (out_file[0] == '/') aa_subst = out_file;
- else aa_subst = alloc_printf("%s/%s", cwd, out_file);
-
- /* 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 (out_file[0] != '/') ck_free(aa_subst);
-
- }
-
- i++;
-
- }
-
- free(cwd); /* not tracked */
-
-}
-
-
/* Set up signal handlers. More complicated that needs to be, because libc on
Solaris doesn't resume interrupted reads(), sets SA_RESETHAND when you call
siginterrupt(), and does other stupid things. */
@@ -8628,7 +8577,28 @@ int main(int argc, char** argv) {
if (!timeout_given) find_timeout();
- detect_file_args(argv + optind + 1);
+ /* If we don't have a file name chosen yet, use a safe default. */
+
+ if (!out_file) {
+ u32 i = optind + 1;
+ while (argv[i]) {
+
+ u8* aa_loc = strstr(argv[i], "@@");
+
+ if (aa_loc && !out_file) {
+ if (file_extension) {
+ out_file = alloc_printf("%s/.cur_input.%s", out_dir, file_extension);
+ } else {
+ out_file = alloc_printf("%s/.cur_input", out_dir);
+ }
+ detect_file_args(argv + optind + 1, out_file);
+ break;
+ }
+
+ i++;
+
+ }
+ }
if (!out_file) setup_stdio_file();

MODIFY
afl-showmap.c
afl-showmap.c
#include "alloc-inl.h"
#include "hash.h"
#include "sharedmem.h"
+#include "afl-common.h"
#include <stdio.h>
#include <unistd.h>
@@ -380,50 +381,6 @@ static void setup_signal_handlers(void) {
}
-/* Detect @@ in args. */
-
-static void detect_file_args(char** argv) {
-
- u32 i = 0;
- u8* cwd = getcwd(NULL, 0);
-
- if (!cwd) PFATAL("getcwd() failed");
-
- while (argv[i]) {
-
- u8* aa_loc = strstr(argv[i], "@@");
-
- if (aa_loc) {
-
- u8 *aa_subst, *n_arg;
-
- if (!at_file) FATAL("@@ syntax is not supported by this tool.");
-
- /* Be sure that we're always using fully-qualified paths. */
-
- if (at_file[0] == '/') aa_subst = at_file;
- else aa_subst = alloc_printf("%s/%s", cwd, at_file);
-
- /* 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 (at_file[0] != '/') ck_free(aa_subst);
-
- }
-
- i++;
-
- }
-
- free(cwd); /* not tracked */
-
-}
-
-
/* Show banner. */
static void show_banner(void) {
@@ -720,7 +677,7 @@ int main(int argc, char** argv) {
ACTF("Executing '%s'...\n", target_path);
}
- detect_file_args(argv + optind);
+ detect_file_args(argv + optind, at_file);
if (qemu_mode)
use_argv = get_qemu_argv(argv[0], argv + optind, argc - optind);

MODIFY
afl-tmin.c
afl-tmin.c
#include "alloc-inl.h"
#include "hash.h"
#include "sharedmem.h"
+#include "afl-common.h"
#include <stdio.h>
#include <unistd.h>
@@ -881,48 +882,6 @@ static void setup_signal_handlers(void) {
}
-/* Detect @@ in args. */
-
-static void detect_file_args(char** argv) {
-
- u32 i = 0;
- u8* cwd = getcwd(NULL, 0);
-
- if (!cwd) PFATAL("getcwd() failed");
-
- while (argv[i]) {
-
- u8* aa_loc = strstr(argv[i], "@@");
-
- if (aa_loc) {
-
- u8 *aa_subst, *n_arg;
-
- /* 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 */
-
-}
-
-
/* Display usage hints. */
static void usage(u8* argv0) {
@@ -1222,7 +1181,7 @@ int main(int argc, char** argv) {
set_up_environment();
find_binary(argv[optind]);
- detect_file_args(argv + optind);
+ detect_file_args(argv + optind, prog_in);
if (qemu_mode)
use_argv = get_qemu_argv(argv[0], argv + optind, argc - optind);

portability fix: getcwd(NULL, 0) is a non-POSIX glibc extension. Refactor
detect_file_args() in a separate file in order to avoid multiple copies.