aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2020-09-25 15:26:26 -0700
committerVitaly Buka <vitalybuka@google.com>2020-09-25 15:26:34 -0700
commit152ff3772c2bc4463555fb5dbb75f9b0dcc700f5 (patch)
tree61dd20dc123e3e4d09d76e389540e09dff860c2b
parent1bec6eb3f5cba594698bae5b2789744e0c8ee5f2 (diff)
downloadllvm-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.cpp2
-rw-r--r--compiler-rt/lib/msan/tests/msan_test.cpp11
-rw-r--r--compiler-rt/lib/sanitizer_common/sanitizer_errno_codes.h1
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;