summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-04-23 11:48:31 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-04-23 11:48:31 +0000
commit7cdae1683c9c2fcd4473a5862c90c64be3a8c5fd (patch)
treed1f619b5f51c7d353e20b0aa5802c17ef1a8085f
parent51ecba39a18cc292c5ecb3adcb6571ad141b5402 (diff)
downloadcompiler-rt-7cdae1683c9c2fcd4473a5862c90c64be3a8c5fd.tar.gz
[msan] Allow clock_getres(, 0).
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@180090 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/msan/tests/msan_test.cc12
-rw-r--r--lib/sanitizer_common/sanitizer_common_interceptors.inc2
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc
index 51b4be82e..db7e55a96 100644
--- a/lib/msan/tests/msan_test.cc
+++ b/lib/msan/tests/msan_test.cc
@@ -880,6 +880,18 @@ TEST(MemorySanitizer, clock_gettime) {
EXPECT_NOT_POISONED(tp.tv_nsec);
}
+TEST(MemorySanitizer, clock_getres) {
+ struct timespec tp;
+ EXPECT_POISONED(tp.tv_sec);
+ EXPECT_POISONED(tp.tv_nsec);
+ assert(0 == clock_getres(CLOCK_REALTIME, 0));
+ EXPECT_POISONED(tp.tv_sec);
+ EXPECT_POISONED(tp.tv_nsec);
+ assert(0 == clock_getres(CLOCK_REALTIME, &tp));
+ EXPECT_NOT_POISONED(tp.tv_sec);
+ EXPECT_NOT_POISONED(tp.tv_nsec);
+}
+
TEST(MemorySanitizer, getitimer) {
struct itimerval it1, it2;
int res;
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 43e5a6df3..a42014373 100644
--- a/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -492,7 +492,7 @@ INTERCEPTOR(int, clock_getres, u32 clk_id, void *tp) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, clock_getres, clk_id, tp);
int res = REAL(clock_getres)(clk_id, tp);
- if (!res) {
+ if (!res && tp) {
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, tp, struct_timespec_sz);
}
return res;