[compiler-rt] ecc2c9b - [sanitizer] Add callbacks for epoll_pwait2

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 2 14:14:38 PDT 2021


Author: Vitaly Buka
Date: 2021-08-02T14:14:19-07:00
New Revision: ecc2c9ba4547b31e0b87b2086368fcb0a20532ac

URL: https://github.com/llvm/llvm-project/commit/ecc2c9ba4547b31e0b87b2086368fcb0a20532ac
DIFF: https://github.com/llvm/llvm-project/commit/ecc2c9ba4547b31e0b87b2086368fcb0a20532ac.diff

LOG: [sanitizer] Add callbacks for epoll_pwait2

Depends on D107207.

Differential Revision: https://reviews.llvm.org/D107209

Added: 
    

Modified: 
    compiler-rt/include/sanitizer/linux_syscall_hooks.h
    compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
    compiler-rt/test/msan/Linux/syscalls.cpp

Removed: 
    


################################################################################
diff  --git a/compiler-rt/include/sanitizer/linux_syscall_hooks.h b/compiler-rt/include/sanitizer/linux_syscall_hooks.h
index 360cfea4dc661..3f3f1e78dfb85 100644
--- a/compiler-rt/include/sanitizer/linux_syscall_hooks.h
+++ b/compiler-rt/include/sanitizer/linux_syscall_hooks.h
@@ -1225,6 +1225,16 @@
   __sanitizer_syscall_post_impl_epoll_pwait(                                   \
       res, (long)(epfd), (long)(events), (long)(maxevents), (long)(timeout),   \
       (long)(sigmask), (long)(sigsetsize))
+#define __sanitizer_syscall_pre_epoll_pwait2(epfd, events, maxevents, timeout, \
+                                             sigmask, sigsetsize)              \
+  __sanitizer_syscall_pre_impl_epoll_pwait2(                                   \
+      (long)(epfd), (long)(events), (long)(maxevents), (long)(timeout),        \
+      (long)(sigmask), (long)(sigsetsize))
+#define __sanitizer_syscall_post_epoll_pwait2(res, epfd, events, maxevents,    \
+                                              timeout, sigmask, sigsetsize)    \
+  __sanitizer_syscall_post_impl_epoll_pwait2(                                  \
+      res, (long)(epfd), (long)(events), (long)(maxevents), (long)(timeout),   \
+      (long)(sigmask), (long)(sigsetsize))
 #define __sanitizer_syscall_pre_gethostname(name, len)                         \
   __sanitizer_syscall_pre_impl_gethostname((long)(name), (long)(len))
 #define __sanitizer_syscall_post_gethostname(res, name, len)                   \
@@ -2696,6 +2706,13 @@ void __sanitizer_syscall_pre_impl_epoll_pwait(long epfd, long events,
 void __sanitizer_syscall_post_impl_epoll_pwait(long res, long epfd, long events,
                                                long maxevents, long timeout,
                                                long sigmask, long sigsetsize);
+void __sanitizer_syscall_pre_impl_epoll_pwait2(long epfd, long events,
+                                               long maxevents, long timeout,
+                                               long sigmask, long sigsetsize);
+void __sanitizer_syscall_post_impl_epoll_pwait2(long res, long epfd,
+                                                long events, long maxevents,
+                                                long timeout, long sigmask,
+                                                long sigsetsize);
 void __sanitizer_syscall_pre_impl_gethostname(long name, long len);
 void __sanitizer_syscall_post_impl_gethostname(long res, long name, long len);
 void __sanitizer_syscall_pre_impl_sethostname(long name, long len);

diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
index 4faa881ceae9c..a38b134085aab 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_syscalls.inc
@@ -2127,6 +2127,26 @@ POST_SYSCALL(epoll_pwait)
   }
 }
 
+PRE_SYSCALL(epoll_pwait2)
+(long epfd, void *events, long maxevents,
+ const sanitizer_kernel_timespec *timeout, const kernel_sigset_t *sigmask,
+ long sigsetsize) {
+  if (timeout)
+    PRE_READ(timeout, sizeof(timeout));
+  if (sigmask)
+    PRE_READ(sigmask, sigsetsize);
+}
+
+POST_SYSCALL(epoll_pwait2)
+(long res, long epfd, void *events, long maxevents,
+ const sanitizer_kernel_timespec *timeout, const void *sigmask,
+ long sigsetsize) {
+  if (res >= 0) {
+    if (events)
+      POST_WRITE(events, res * struct_epoll_event_sz);
+  }
+}
+
 PRE_SYSCALL(gethostname)(void *name, long len) {}
 
 POST_SYSCALL(gethostname)(long res, void *name, long len) {

diff  --git a/compiler-rt/test/msan/Linux/syscalls.cpp b/compiler-rt/test/msan/Linux/syscalls.cpp
index c3111c5117016..e9525a5796ec4 100644
--- a/compiler-rt/test/msan/Linux/syscalls.cpp
+++ b/compiler-rt/test/msan/Linux/syscalls.cpp
@@ -141,5 +141,14 @@ int main(int argc, char *argv[]) {
   __sanitizer_syscall_post_epoll_pwait(max_events, 0, buf, max_events, 0, &sigset, sizeof(sigset));
   assert(__msan_test_shadow(buf, sizeof(buf)) == max_events * sizeof(epoll_event));
 
+  __msan_poison(buf, sizeof(buf));
+  sigset = {};
+  timespec timespec = {};
+  __sanitizer_syscall_pre_epoll_pwait2(0, buf, max_events, &timespec,
+                                       &sigset, sizeof(sigset));
+  __sanitizer_syscall_post_epoll_pwait2(max_events, 0, buf, max_events,
+                                        &timespec, &sigset, sizeof(sigset));
+  assert(__msan_test_shadow(buf, sizeof(buf)) == max_events * sizeof(epoll_event));
+
   return 0;
 }


        


More information about the llvm-commits mailing list