diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-10-18 12:00:16 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-10-18 12:01:24 +0200 |
| commit | f89294761cb8f89e11aecb58ee27629fcfeafbc3 (patch) | |
| tree | f27f681077bdb126aea433d866bce03b72f86cd5 /executor/common_freebsd.h | |
| parent | 6368c469a5868b3e1d40ba95a44561f895698bcc (diff) | |
executor: use forkserver for freebsd
Use forkserver and shmem for freebsd.
This greatly improves speed.
Also introduce fallback coverage signal based
on unique (syscall+errno) pairs.
Diffstat (limited to 'executor/common_freebsd.h')
| -rw-r--r-- | executor/common_freebsd.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/executor/common_freebsd.h b/executor/common_freebsd.h index c072b12aa..0712942bd 100644 --- a/executor/common_freebsd.h +++ b/executor/common_freebsd.h @@ -17,6 +17,9 @@ #include <sys/wait.h> #include <time.h> #endif +#if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT) && defined(SYZ_USE_TMP_DIR)) +#include <dirent.h> +#endif #define doexit exit @@ -86,6 +89,58 @@ static void sleep_ms(uint64_t ms) } #endif +#if defined(SYZ_EXECUTOR) || (defined(SYZ_REPEAT) && defined(SYZ_WAIT_REPEAT) && defined(SYZ_USE_TMP_DIR)) +static void remove_dir(const char* dir) +{ + DIR* dp; + struct dirent* ep; + int iter = 0; +retry: + dp = opendir(dir); + if (dp == NULL) + return; + while ((ep = readdir(dp))) { + if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) + continue; + char filename[FILENAME_MAX]; + snprintf(filename, sizeof(filename), "%s/%s", dir, ep->d_name); + struct stat st; + if (lstat(filename, &st)) + return; + if (S_ISDIR(st.st_mode)) { + remove_dir(filename); + continue; + } + int i; + for (i = 0;; i++) { + if (unlink(filename) == 0) + break; + if (errno == EROFS) + break; + if (errno != EBUSY || i > 100) + return; + } + } + closedir(dp); + int i; + for (i = 0;; i++) { + if (rmdir(dir) == 0) + break; + if (i < 100) { + if (errno == EROFS) + break; + if (errno == ENOTEMPTY) { + if (iter < 100) { + iter++; + goto retry; + } + } + } + return; + } +} +#endif + #if defined(SYZ_EXECUTOR) || defined(SYZ_FAULT_INJECTION) static int inject_fault(int nth) { |
