afl-showmap: Allow @@ to be part of an arg

The previous implementation of "@@ handling"
in afl-showmap differed greatly from how it was
handled in afl-fuzz and how the documentation presented it.

It used to require that the @@ be its own argument separated
by whitespace and could not be used in situations like "--file=@@".

This change standardizes it to use detect_file_args() like
everybody else does, so that it will have the expected and
documented behavior.
This commit is contained in:
realmadsci
2021-03-15 13:12:11 -04:00
parent b289e7ad07
commit 27c0480866
2 changed files with 33 additions and 48 deletions

View File

@ -70,15 +70,12 @@ void detect_file_args(char **argv, u8 *prog_in, bool *use_stdin) {
*use_stdin = false;
if (prog_in[0] != 0) { // not afl-showmap special case
u8 *n_arg;
/* Be sure that we're always using fully-qualified paths. */
*aa_loc = 0;
/* Construct a replacement argv value. */
u8 *n_arg;
if (prog_in[0] == '/') {
@ -95,8 +92,6 @@ void detect_file_args(char **argv, u8 *prog_in, bool *use_stdin) {
}
}
i++;
}

View File

@ -72,8 +72,7 @@ static u8 *in_data, /* Input data */
static u64 total; /* tuple content information */
static u32 tcnt, highest; /* tuple content information */
static u32 in_len, /* Input data length */
arg_offset; /* Total number of execs */
static u32 in_len; /* Input data length */
static u32 map_size = MAP_SIZE;
@ -738,7 +737,7 @@ int main(int argc, char **argv_orig, char **envp) {
// TODO: u64 mem_limit = MEM_LIMIT; /* Memory limit (MB) */
s32 opt, i;
s32 opt;
u8 mem_limit_given = 0, timeout_given = 0, unicorn_mode = 0, use_wine = 0;
char **use_argv;
@ -986,7 +985,7 @@ int main(int argc, char **argv_orig, char **envp) {
if (getenv("AFL_DEBUG")) {
DEBUGF("");
for (i = 0; i < argc; i++)
for (int i = 0; i < argc; i++)
SAYF(" %s", argv[i]);
SAYF("\n");
@ -1012,12 +1011,30 @@ int main(int argc, char **argv_orig, char **envp) {
}
if (in_dir) {
detect_file_args(argv + optind, "", &fsrv->use_stdin);
/* If we don't have a file name chosen yet, use a safe default. */
u8 *use_dir = ".";
if (access(use_dir, R_OK | W_OK | X_OK)) {
use_dir = get_afl_env("TMPDIR");
if (!use_dir) { use_dir = "/tmp"; }
}
stdin_file = at_file ? strdup(at_file)
: (char *)alloc_printf("%s/.afl-showmap-temp-%u",
use_dir, (u32)getpid());
unlink(stdin_file);
// If @@ are in the target args, replace them and also set use_stdin=false.
detect_file_args(argv + optind, stdin_file, &fsrv->use_stdin);
} else {
// If @@ are in the target args, replace them and also set use_stdin=false.
detect_file_args(argv + optind, at_file, &fsrv->use_stdin);
}
@ -1042,14 +1059,6 @@ int main(int argc, char **argv_orig, char **envp) {
}
i = 0;
while (use_argv[i] != NULL && !arg_offset) {
if (strcmp(use_argv[i], "@@") == 0) { arg_offset = i; }
i++;
}
shm_fuzz = ck_alloc(sizeof(sharedmem_t));
/* initialize cmplog_mode */
@ -1160,30 +1169,11 @@ int main(int argc, char **argv_orig, char **envp) {
}
u8 *use_dir = ".";
if (access(use_dir, R_OK | W_OK | X_OK)) {
use_dir = get_afl_env("TMPDIR");
if (!use_dir) { use_dir = "/tmp"; }
}
stdin_file = at_file ? strdup(at_file)
: (char *)alloc_printf("%s/.afl-showmap-temp-%u",
use_dir, (u32)getpid());
unlink(stdin_file);
atexit(at_exit_handler);
fsrv->out_file = stdin_file;
fsrv->out_fd = open(stdin_file, O_RDWR | O_CREAT | O_EXCL, 0600);
if (fsrv->out_fd < 0) { PFATAL("Unable to create '%s'", out_file); }
if (arg_offset && use_argv[arg_offset] != stdin_file) {
use_argv[arg_offset] = strdup(stdin_file);
}
if (get_afl_env("AFL_DEBUG")) {
int j = optind;