From 49b5a873008ac96c927b254ee746dbd96f2f1a9d Mon Sep 17 00:00:00 2001 From: Cristian Cadar Date: Fri, 9 Aug 2019 11:07:48 +0100 Subject: Changed klee-replay to create a temporary directory with a random name in /tmp instead of using a fixed name in the current directory. --- tools/klee-replay/file-creator.c | 37 ++++++++++++++++++++++++++++++------- tools/klee-replay/klee-replay.c | 15 +++++++++------ tools/klee-replay/klee-replay.h | 5 ++++- 3 files changed, 43 insertions(+), 14 deletions(-) (limited to 'tools') diff --git a/tools/klee-replay/file-creator.c b/tools/klee-replay/file-creator.c index a218e6b0..58580f94 100644 --- a/tools/klee-replay/file-creator.c +++ b/tools/klee-replay/file-creator.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -431,18 +432,21 @@ static void create_file(int target_fd, } } +char replay_dir[] = "/tmp/klee-replay-XXXXXX"; + void replay_create_files(exe_file_system_t *exe_fs) { - char tmpdir[PATH_MAX]; unsigned k; - if (!getcwd(tmpdir, PATH_MAX)) { - perror("getcwd"); - exit(1); + // Create a temporary directory to place files involved in replay + strcpy(replay_dir, "/tmp/klee-replay-XXXXXX"); // new template for each replayed file + char* tmpdir = mkdtemp(replay_dir); + + if (tmpdir == NULL) { + perror("mkdtemp: could not create temporary directory"); + exit(EXIT_FAILURE); } - strcat(tmpdir, ".temps"); - delete_file(tmpdir, 1); - mkdir(tmpdir, 0755); + fprintf(stderr, "note: storing KLEE replay files in %s\n", tmpdir); umask(0); for (k=0; k < exe_fs->n_sym_files; k++) { @@ -467,6 +471,25 @@ void replay_create_files(exe_file_system_t *exe_fs) { check_file(k, &exe_fs->sym_files[k]); } + +/* Used by nftw() in replay_delete_files() */ +int remove_callback(const char *fpath, + __attribute__((unused)) const struct stat *sb, + __attribute__((unused)) int typeflag, + __attribute__((unused)) struct FTW *ftwbuf) { + return remove(fpath); +} + +void replay_delete_files() { + fprintf(stderr, "removing %s\n", replay_dir); + + if (nftw(replay_dir, remove_callback, FOPEN_MAX, + FTW_DEPTH | FTW_PHYS) == -1) { + perror("nftw"); + exit(EXIT_FAILURE); + } +} + static void check_file(int index, exe_disk_file_t *dfile) { struct stat s; int res; diff --git a/tools/klee-replay/klee-replay.c b/tools/klee-replay/klee-replay.c index 9261535a..1399985d 100644 --- a/tools/klee-replay/klee-replay.c +++ b/tools/klee-replay/klee-replay.c @@ -18,11 +18,10 @@ #include #include #include +#include #include #include -#include - #if defined(__APPLE__) || defined(__FreeBSD__) #include #define fgetc_unlocked(x) fgetc (x) @@ -348,7 +347,6 @@ int main(int argc, char** argv) { prg_argv = input->args; prg_argv[0] = argv[optind]; klee_init_env(&prg_argc, &prg_argv); - if (idx > 2) fprintf(stderr, "\n"); fprintf(stderr, "%s: TEST CASE: %s\n", progname, input_fname); @@ -360,6 +358,9 @@ int main(int argc, char** argv) { } fprintf(stderr, "\n"); + /* Create the input files, pipes, etc. */ + replay_create_files(&__exe_fs); + /* Run the test case machinery in a subprocess, eventually this parent process should be a script or something which shells out to the actual execution tool. */ @@ -368,18 +369,20 @@ int main(int argc, char** argv) { perror("fork"); _exit(66); } else if (pid == 0) { - /* Create the input files, pipes, etc., and run the process. */ - replay_create_files(&__exe_fs); + /* Run the executable */ run_monitored(executable, prg_argc, prg_argv); _exit(0); } else { - /* Wait for the test case. */ + /* Wait for the executable to finish. */ int res, status; do { res = waitpid(pid, &status, 0); } while (res < 0 && errno == EINTR); + // Delete all files in the replay directory + replay_delete_files(); + if (res < 0) { perror("waitpid"); _exit(66); diff --git a/tools/klee-replay/klee-replay.h b/tools/klee-replay/klee-replay.h index b4d0f248..8dc3b872 100644 --- a/tools/klee-replay/klee-replay.h +++ b/tools/klee-replay/klee-replay.h @@ -18,7 +18,11 @@ #include "../../runtime/POSIX/fd.h" #include +// temporary directory used for replay +extern char replay_dir[]; + void replay_create_files(exe_file_system_t *exe_fs); +void replay_delete_files(); void process_status(int status, time_t elapsed, @@ -26,4 +30,3 @@ void process_status(int status, __attribute__((noreturn)); #endif - -- cgit 1.4.1