summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compiler-rt/lib/asan/lit_tests/time_interceptor.cc20
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc2
2 files changed, 21 insertions, 1 deletions
diff --git a/compiler-rt/lib/asan/lit_tests/time_interceptor.cc b/compiler-rt/lib/asan/lit_tests/time_interceptor.cc
new file mode 100644
index 00000000000..bade7bbc687
--- /dev/null
+++ b/compiler-rt/lib/asan/lit_tests/time_interceptor.cc
@@ -0,0 +1,20 @@
+// RUN: %clangxx_asan -m64 -O0 %s -fsanitize-address-zero-base-shadow -pie -o %t && %t 2>&1 | %symbolize | FileCheck %s
+
+// Test the time() interceptor. Also includes a regression test for time(NULL),
+// which caused ASan to crash in the zero-based shadow mode.
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+int main() {
+ time_t *tm = (time_t*)malloc(sizeof(time_t));
+ free(tm);
+ time_t t = time(NULL);
+ fprintf(stderr, "Time: %s\n", ctime(&t));
+ // CHECK: {{Time: .* .* .*}}
+ t = time(tm);
+ printf("Time: %s\n", ctime(&t));
+ // CHECK: use-after-free
+ return 0;
+}
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 18ff952dfa1..43e5a6df355 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -236,7 +236,7 @@ INTERCEPTOR(unsigned long, time, unsigned long *t) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, time, t);
unsigned long res = REAL(time)(t);
- if (res != (unsigned long)-1) {
+ if (t && res != (unsigned long)-1) {
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, t, sizeof(*t));
}
return res;
OpenPOWER on IntegriCloud