aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/afl-common.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/src/afl-common.c b/src/afl-common.c
index 87003b03..53524e96 100644
--- a/src/afl-common.c
+++ b/src/afl-common.c
@@ -34,6 +34,7 @@
#endif
#include <string.h>
#include <strings.h>
+#include <time.h>
#include <math.h>
#include <sys/mman.h>
@@ -58,6 +59,26 @@ u8 last_intr = 0;
#define AFL_PATH "/usr/local/lib/afl/"
#endif
+/* - Some BSD (i.e.: FreeBSD) offer the FAST clock source as
+ * equivalent to Linux COARSE clock source. Aliasing COARSE to
+ * FAST on such systems when COARSE is not already defined.
+ * - macOS has no support of CLOCK_MONOTONIC_COARSE clock type.
+ */
+#if defined (OS_DARWIN) || defined (OS_SUNOS)
+# define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC
+#elif defined (OS_FREEBSD)
+# define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC_FAST
+#endif
+
+/* Convert seconds to milliseconds. */
+#define SEC_TO_MS(sec) ((sec)*1000)
+/* Convert seconds to microseconds. */
+#define SEC_TO_US(sec) ((sec)*1000000)
+/* Convert nanoseconds to milliseconds. */
+#define NS_TO_MS(ns) ((ns)/1000000)
+/* Convert nanoseconds to microseconds. */
+#define NS_TO_US(ns) ((ns)/1000)
+
void *afl_memmem(const void *haystack, size_t haystacklen, const void *needle,
size_t needlelen) {
@@ -973,27 +994,27 @@ void read_bitmap(u8 *fname, u8 *map, size_t len) {
/* Get unix time in milliseconds */
inline u64 get_cur_time(void) {
+ struct timespec ts;
+ int rc = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
+ if (rc == -1) {
+ PFATAL("Failed to obtain timestamp (errno = %i: %s)\n",
+ errno, strerror(errno));
+ }
- struct timeval tv;
- struct timezone tz;
-
- gettimeofday(&tv, &tz);
-
- return (tv.tv_sec * 1000ULL) + (tv.tv_usec / 1000);
-
+ return SEC_TO_MS((uint64_t)ts.tv_sec) + NS_TO_MS((uint64_t)ts.tv_nsec);
}
/* Get unix time in microseconds */
u64 get_cur_time_us(void) {
+ struct timespec ts;
+ int rc = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
+ if (rc == -1) {
+ PFATAL("Failed to obtain timestamp (errno = %i: %s)\n",
+ errno, strerror(errno));
+ }
- struct timeval tv;
- struct timezone tz;
-
- gettimeofday(&tv, &tz);
-
- return (tv.tv_sec * 1000000ULL) + tv.tv_usec;
-
+ return SEC_TO_US((uint64_t)ts.tv_sec) + NS_TO_US((uint64_t)ts.tv_nsec);
}
/* Describe integer. The buf should be