mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-08 08:11:34 +00:00
70 lines
1.3 KiB
C
70 lines
1.3 KiB
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 */
|
|
|
|
}
|
|
|