diff options
-rw-r--r-- | compiler-rt/lib/msan/msan_interceptors.cc | 1 | ||||
-rw-r--r-- | compiler-rt/lib/msan/tests/msan_test.cc | 18 |
2 files changed, 19 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc index 88e19d0db52..190c908b559 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cc +++ b/compiler-rt/lib/msan/msan_interceptors.cc @@ -577,6 +577,7 @@ INTERCEPTOR(char *, fcvt, double x, int a, int *b, int *c) { if (!__msan_has_dynamic_component()) { __msan_unpoison(b, sizeof(*b)); __msan_unpoison(c, sizeof(*c)); + if (res) __msan_unpoison(res, REAL(strlen)(res) + 1); } return res; } diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc index 813606ed371..2266cdd0249 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cc +++ b/compiler-rt/lib/msan/tests/msan_test.cc @@ -2064,8 +2064,26 @@ TEST(MemorySanitizer, fcvt) { char *str = fcvt(12345.6789, 10, &a, &b); EXPECT_NOT_POISONED(a); EXPECT_NOT_POISONED(b); + ASSERT_NE(nullptr, str); + EXPECT_NOT_POISONED(str[0]); + ASSERT_NE(0U, strlen(str)); } +TEST(MemorySanitizer, fcvt_long) { + int a, b; + break_optimization(&a); + break_optimization(&b); + EXPECT_POISONED(a); + EXPECT_POISONED(b); + char *str = fcvt(111111112345.6789, 10, &a, &b); + EXPECT_NOT_POISONED(a); + EXPECT_NOT_POISONED(b); + ASSERT_NE(nullptr, str); + EXPECT_NOT_POISONED(str[0]); + ASSERT_NE(0U, strlen(str)); +} + + TEST(MemorySanitizer, memchr) { char x[10]; break_optimization(x); |