xref: /aosp_15_r20/external/compiler-rt/test/msan/sigwaitinfo.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot // RUN: %clangxx_msan -std=c++11 -O0 -g %s -o %t && %run %t
2*7c3d14c8STreehugger Robot 
3*7c3d14c8STreehugger Robot #include <assert.h>
4*7c3d14c8STreehugger Robot #include <sanitizer/msan_interface.h>
5*7c3d14c8STreehugger Robot #include <signal.h>
6*7c3d14c8STreehugger Robot #include <sys/time.h>
7*7c3d14c8STreehugger Robot #include <unistd.h>
8*7c3d14c8STreehugger Robot 
test_sigwaitinfo()9*7c3d14c8STreehugger Robot void test_sigwaitinfo() {
10*7c3d14c8STreehugger Robot   sigset_t s;
11*7c3d14c8STreehugger Robot   sigemptyset(&s);
12*7c3d14c8STreehugger Robot   sigaddset(&s, SIGUSR1);
13*7c3d14c8STreehugger Robot   sigprocmask(SIG_BLOCK, &s, 0);
14*7c3d14c8STreehugger Robot 
15*7c3d14c8STreehugger Robot   if (pid_t pid = fork()) {
16*7c3d14c8STreehugger Robot     kill(pid, SIGUSR1);
17*7c3d14c8STreehugger Robot     _exit(0);
18*7c3d14c8STreehugger Robot   } else {
19*7c3d14c8STreehugger Robot     siginfo_t info;
20*7c3d14c8STreehugger Robot     int res = sigwaitinfo(&s, &info);
21*7c3d14c8STreehugger Robot     assert(!res);
22*7c3d14c8STreehugger Robot     // The following checks that sig is initialized.
23*7c3d14c8STreehugger Robot     assert(info.si_signo == SIGUSR1);
24*7c3d14c8STreehugger Robot     assert(-1 == __msan_test_shadow(&info, sizeof(info)));
25*7c3d14c8STreehugger Robot   }
26*7c3d14c8STreehugger Robot }
27*7c3d14c8STreehugger Robot 
main(void)28*7c3d14c8STreehugger Robot int main(void) {
29*7c3d14c8STreehugger Robot   test_sigwaitinfo();
30*7c3d14c8STreehugger Robot   return 0;
31*7c3d14c8STreehugger Robot }
32