aboutsummaryrefslogtreecommitdiffstats
path: root/executor/common_freebsd.h
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-10-18 12:00:16 +0200
committerDmitry Vyukov <dvyukov@google.com>2017-10-18 12:01:24 +0200
commitf89294761cb8f89e11aecb58ee27629fcfeafbc3 (patch)
treef27f681077bdb126aea433d866bce03b72f86cd5 /executor/common_freebsd.h
parent6368c469a5868b3e1d40ba95a44561f895698bcc (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.h55
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)
{