[msan] gethostbyname interceptor.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Wed, 23 Jan 2013 10:43:38 +0000 (10:43 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Wed, 23 Jan 2013 10:43:38 +0000 (10:43 +0000)
llvm-svn: 173249

compiler-rt/lib/msan/msan_interceptors.cc
compiler-rt/lib/msan/tests/msan_test.cc

index 102e61a6d4f83f937f640d78437777d1217e7079..f64f443187db012b9278d41e3722aced781fc70e 100644 (file)
@@ -612,6 +612,18 @@ INTERCEPTOR(int, uname, void *utsname) {
   return res;
 }
 
+INTERCEPTOR(int, gethostname, char *name, SIZE_T len) {
+  ENSURE_MSAN_INITED();
+  int res = REAL(gethostname)(name, len);
+  if (!res) {
+    SIZE_T real_len = REAL(strnlen)(name, len);
+    if (real_len < len)
+      ++real_len;
+    __msan_unpoison(name, real_len);
+  }
+  return res;
+}
+
 INTERCEPTOR(int, epoll_wait, int epfd, void *events, int maxevents,
     int timeout) {
   ENSURE_MSAN_INITED();
@@ -936,6 +948,7 @@ void InitializeInterceptors() {
   INTERCEPT_FUNCTION(statfs64);
   INTERCEPT_FUNCTION(fstatfs64);
   INTERCEPT_FUNCTION(uname);
+  INTERCEPT_FUNCTION(gethostname);
   INTERCEPT_FUNCTION(epoll_wait);
   INTERCEPT_FUNCTION(epoll_pwait);
   INTERCEPT_FUNCTION(recv);
index 4401848f531263c64607747ce29717a6991d77a3..f65d6f9bff77ffbfdcce2d37dd2acb9620c687f4 100644 (file)
@@ -1306,6 +1306,13 @@ TEST(MemorySanitizer, uname) {
   EXPECT_NOT_POISONED(strlen(u.machine));
 }
 
+TEST(MemorySanitizer, gethostname) {
+  char buf[100];
+  int res = gethostname(buf, 100);
+  assert(!res);
+  EXPECT_NOT_POISONED(strlen(buf));
+}
+
 template<class T>
 static bool applySlt(T value, T shadow) {
   __msan_partial_poison(&value, &shadow, sizeof(T));