[compiler-rt] r179177 - [ASan] Do not check the shadow of NULL argument in the time() interceptor.
Alexander Potapenko
glider at google.com
Wed Apr 10 08:13:01 PDT 2013
Author: glider
Date: Wed Apr 10 10:13:00 2013
New Revision: 179177
URL: http://llvm.org/viewvc/llvm-project?rev=179177&view=rev
Log:
[ASan] Do not check the shadow of NULL argument in the time() interceptor.
Add a test for time().
Added:
compiler-rt/trunk/lib/asan/lit_tests/time_interceptor.cc
Modified:
compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
Added: compiler-rt/trunk/lib/asan/lit_tests/time_interceptor.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/time_interceptor.cc?rev=179177&view=auto
==============================================================================
--- compiler-rt/trunk/lib/asan/lit_tests/time_interceptor.cc (added)
+++ compiler-rt/trunk/lib/asan/lit_tests/time_interceptor.cc Wed Apr 10 10:13:00 2013
@@ -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;
+}
Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=179177&r1=179176&r2=179177&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc Wed Apr 10 10:13:00 2013
@@ -236,7 +236,7 @@ INTERCEPTOR(unsigned long, time, unsigne
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;
More information about the llvm-commits
mailing list