diff options
author | Vitaly Buka <vitalybuka@google.com> | 2020-09-25 15:26:26 -0700 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2020-09-25 15:26:34 -0700 |
commit | 152ff3772c2bc4463555fb5dbb75f9b0dcc700f5 (patch) | |
tree | 61dd20dc123e3e4d09d76e389540e09dff860c2b | |
parent | 1bec6eb3f5cba594698bae5b2789744e0c8ee5f2 (diff) | |
download | llvm-152ff3772c2bc4463555fb5dbb75f9b0dcc700f5.zip llvm-152ff3772c2bc4463555fb5dbb75f9b0dcc700f5.tar.gz llvm-152ff3772c2bc4463555fb5dbb75f9b0dcc700f5.tar.bz2 |
[msan] Skip memcpy interceptor called by gethostname
No test as reproducer requires particular glibc build.
Reviewed By: eugenis
Differential Revision: https://reviews.llvm.org/D88284
-rw-r--r-- | compiler-rt/lib/msan/msan_interceptors.cpp | 2 | ||||
-rw-r--r-- | compiler-rt/lib/msan/tests/msan_test.cpp | 11 | ||||
-rw-r--r-- | compiler-rt/lib/sanitizer_common/sanitizer_errno_codes.h | 1 |
3 files changed, 10 insertions, 4 deletions
diff --git a/compiler-rt/lib/msan/msan_interceptors.cpp b/compiler-rt/lib/msan/msan_interceptors.cpp index 6459c7a..0a17828 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cpp +++ b/compiler-rt/lib/msan/msan_interceptors.cpp @@ -827,7 +827,7 @@ INTERCEPTOR(int, prlimit64, int pid, int resource, void *new_rlimit, INTERCEPTOR(int, gethostname, char *name, SIZE_T len) { ENSURE_MSAN_INITED(); int res = REAL(gethostname)(name, len); - if (!res) { + if (!res || (res == -1 && errno == errno_ENAMETOOLONG)) { SIZE_T real_len = REAL(strnlen)(name, len); if (real_len < len) ++real_len; diff --git a/compiler-rt/lib/msan/tests/msan_test.cpp b/compiler-rt/lib/msan/tests/msan_test.cpp index 1ece56e..e0b8a6a 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cpp +++ b/compiler-rt/lib/msan/tests/msan_test.cpp @@ -3535,9 +3535,14 @@ TEST(MemorySanitizer, uname) { } TEST(MemorySanitizer, gethostname) { - char buf[100]; - int res = gethostname(buf, 100); - ASSERT_EQ(0, res); + char buf[1000]; + EXPECT_EQ(-1, gethostname(buf, 1)); + EXPECT_EQ(ENAMETOOLONG, errno); + EXPECT_NOT_POISONED(buf[0]); + EXPECT_POISONED(buf[1]); + + __msan_poison(buf, sizeof(buf)); + EXPECT_EQ(0, gethostname(buf, sizeof(buf))); EXPECT_NOT_POISONED(strlen(buf)); } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_errno_codes.h b/compiler-rt/lib/sanitizer_common/sanitizer_errno_codes.h index f388d0d..192e939 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_errno_codes.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_errno_codes.h @@ -24,6 +24,7 @@ namespace __sanitizer { #define errno_ENOMEM 12 #define errno_EBUSY 16 #define errno_EINVAL 22 +#define errno_ENAMETOOLONG 36 // Those might not present or their value differ on different platforms. extern const int errno_EOWNERDEAD; |