Mark Wielaard 71c761
commit 515c3b6de3eff6ddf88fd14a0084b8ad0c692553
Mark Wielaard 71c761
Author: iraisr <iraisr@a5019735-40e9-0310-863c-91ae7b9d1cf9>
Mark Wielaard 71c761
Date:   Tue Mar 8 09:04:48 2016 +0000
Mark Wielaard 71c761
Mark Wielaard 71c761
    Sanitize signal mask in ppoll and pselect syscalls
Mark Wielaard 71c761
    Reported and Linux patch contributed by Steven Smith <sos22@archy.org.uk>
Mark Wielaard 71c761
    Fixes BZ#359871
Mark Wielaard 71c761
    
Mark Wielaard 71c761
    
Mark Wielaard 71c761
    
Mark Wielaard 71c761
    git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15823 a5019735-40e9-0310-863c-91ae7b9d1cf9
Mark Wielaard 71c761
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/priv_syswrap-main.h b/coregrind/m_syswrap/priv_syswrap-main.h
Mark Wielaard 71c761
index cabad7c..3164c81 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/priv_syswrap-main.h
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/priv_syswrap-main.h
Mark Wielaard 71c761
@@ -38,6 +38,9 @@
Mark Wielaard 71c761
 extern
Mark Wielaard 71c761
 void ML_(fixup_guest_state_to_restart_syscall) ( ThreadArchState* arch );
Mark Wielaard 71c761
 
Mark Wielaard 71c761
+extern
Mark Wielaard 71c761
+void VG_(sanitize_client_sigmask)(vki_sigset_t *mask);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
 #if defined(VGO_darwin)
Mark Wielaard 71c761
 /* Longjmp to scheduler after client calls workq_ops(WQOPS_THREAD_RETURN)*/
Mark Wielaard 71c761
 extern
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c
Mark Wielaard 71c761
index 7c88bc2..4a8344b 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-amd64-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-amd64-linux.c
Mark Wielaard 71c761
@@ -1018,7 +1018,7 @@ static SyscallTableEntry syscall_table[] = {
Mark Wielaard 71c761
    LINX_(__NR_fchmodat,		 sys_fchmodat),         // 268
Mark Wielaard 71c761
    LINX_(__NR_faccessat,	 sys_faccessat),        // 269
Mark Wielaard 71c761
 
Mark Wielaard 71c761
-   LINX_(__NR_pselect6,		 sys_pselect6),         // 270
Mark Wielaard 71c761
+   LINXY(__NR_pselect6,		 sys_pselect6),         // 270
Mark Wielaard 71c761
    LINXY(__NR_ppoll,		 sys_ppoll),            // 271
Mark Wielaard 71c761
    LINX_(__NR_unshare,		 sys_unshare),          // 272
Mark Wielaard 71c761
    LINX_(__NR_set_robust_list,	 sys_set_robust_list),  // 273
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-arm-linux.c b/coregrind/m_syswrap/syswrap-arm-linux.c
Mark Wielaard 71c761
index 3ccad12..224070c 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-arm-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-arm-linux.c
Mark Wielaard 71c761
@@ -1188,7 +1188,7 @@ static SyscallTableEntry syscall_main_table[] = {
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    LINX_(__NR_arm_fadvise64_64,  sys_fadvise64_64),     // 270 */(Linux?)
Mark Wielaard 71c761
 
Mark Wielaard 71c761
-   LINX_(__NR_pselect6,          sys_pselect6),         // 335
Mark Wielaard 71c761
+   LINXY(__NR_pselect6,          sys_pselect6),         // 335
Mark Wielaard 71c761
    LINXY(__NR_ppoll,             sys_ppoll),            // 336
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    LINXY(__NR_epoll_pwait,       sys_epoll_pwait),      // 346
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-arm64-linux.c b/coregrind/m_syswrap/syswrap-arm64-linux.c
Mark Wielaard 71c761
index 8d3027d..abddff1 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-arm64-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-arm64-linux.c
Mark Wielaard 71c761
@@ -924,7 +924,7 @@ static SyscallTableEntry syscall_main_table[] = {
Mark Wielaard 71c761
    GENX_(__NR_writev,            sys_writev),            // 66
Mark Wielaard 71c761
    GENXY(__NR_pread64,           sys_pread64),           // 67
Mark Wielaard 71c761
    GENX_(__NR_pwrite64,          sys_pwrite64),          // 68
Mark Wielaard 71c761
-   LINX_(__NR_pselect6,          sys_pselect6),          // 72
Mark Wielaard 71c761
+   LINXY(__NR_pselect6,          sys_pselect6),          // 72
Mark Wielaard 71c761
    LINXY(__NR_ppoll,             sys_ppoll),             // 73
Mark Wielaard 71c761
    LINXY(__NR_signalfd4,         sys_signalfd4),         // 74
Mark Wielaard 71c761
    LINX_(__NR_readlinkat,        sys_readlinkat),        // 78
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 71c761
index f2d1076..6fdacda 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-linux.c
Mark Wielaard 71c761
@@ -62,6 +62,7 @@
Mark Wielaard 71c761
 #include "priv_types_n_macros.h"
Mark Wielaard 71c761
 #include "priv_syswrap-generic.h"
Mark Wielaard 71c761
 #include "priv_syswrap-linux.h"
Mark Wielaard 71c761
+#include "priv_syswrap-main.h"
Mark Wielaard 71c761
 #include "priv_syswrap-xen.h"
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 // Run a thread from beginning to end and return the thread's
Mark Wielaard 71c761
@@ -1272,9 +1273,18 @@ POST(sys_get_robust_list)
Mark Wielaard 71c761
    POST_MEM_WRITE(ARG3, sizeof(struct vki_size_t *));
Mark Wielaard 71c761
 }
Mark Wielaard 71c761
 
Mark Wielaard 71c761
+struct pselect_sized_sigset {
Mark Wielaard 71c761
+    const vki_sigset_t *ss;
Mark Wielaard 71c761
+    vki_size_t ss_len;
Mark Wielaard 71c761
+};
Mark Wielaard 71c761
+struct pselect_adjusted_sigset {
Mark Wielaard 71c761
+    struct pselect_sized_sigset ss; /* The actual syscall arg */
Mark Wielaard 71c761
+    vki_sigset_t adjusted_ss;
Mark Wielaard 71c761
+};
Mark Wielaard 71c761
+
Mark Wielaard 71c761
 PRE(sys_pselect6)
Mark Wielaard 71c761
 {
Mark Wielaard 71c761
-   *flags |= SfMayBlock;
Mark Wielaard 71c761
+   *flags |= SfMayBlock | SfPostOnFail;
Mark Wielaard 71c761
    PRINT("sys_pselect6 ( %ld, %#lx, %#lx, %#lx, %#lx, %#lx )",
Mark Wielaard 71c761
          SARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
Mark Wielaard 71c761
    PRE_REG_READ6(long, "pselect6",
Mark Wielaard 71c761
@@ -1293,15 +1303,41 @@ PRE(sys_pselect6)
Mark Wielaard 71c761
 		     ARG4, ARG1/8 /* __FD_SETSIZE/8 */ );
Mark Wielaard 71c761
    if (ARG5 != 0)
Mark Wielaard 71c761
       PRE_MEM_READ( "pselect6(timeout)", ARG5, sizeof(struct vki_timeval) );
Mark Wielaard 71c761
-   if (ARG6 != 0)
Mark Wielaard 71c761
-      PRE_MEM_READ( "pselect6(sig)", ARG6, sizeof(void *)+sizeof(vki_size_t) );
Mark Wielaard 71c761
+   if (ARG6 != 0) {
Mark Wielaard 71c761
+      const struct pselect_sized_sigset *pss =
Mark Wielaard 71c761
+          (struct pselect_sized_sigset *)ARG6;
Mark Wielaard 71c761
+      PRE_MEM_READ( "pselect6(sig)", ARG6, sizeof(*pss) );
Mark Wielaard 71c761
+      if (!ML_(safe_to_deref)(pss, sizeof(*pss))) {
Mark Wielaard 71c761
+         ARG6 = 1; /* Something recognisable to POST() hook. */
Mark Wielaard 71c761
+      } else {
Mark Wielaard 71c761
+         struct pselect_adjusted_sigset *pas;
Mark Wielaard 71c761
+         pas = VG_(malloc)("syswrap.pselect6.1", sizeof(*pas));
Mark Wielaard 71c761
+         ARG6 = (Addr)pas;
Mark Wielaard 71c761
+         pas->ss.ss = (void *)1;
Mark Wielaard 71c761
+         pas->ss.ss_len = pss->ss_len;
Mark Wielaard 71c761
+         if (pss->ss_len == sizeof(*pss->ss)) {
Mark Wielaard 71c761
+            PRE_MEM_READ("pselect6(sig->ss)", (Addr)pss->ss, pss->ss_len);
Mark Wielaard 71c761
+            if (ML_(safe_to_deref)(pss->ss, sizeof(*pss->ss))) {
Mark Wielaard 71c761
+               pas->adjusted_ss = *pss->ss;
Mark Wielaard 71c761
+               pas->ss.ss = &pas->adjusted_ss;
Mark Wielaard 71c761
+               VG_(sanitize_client_sigmask)(&pas->adjusted_ss);
Mark Wielaard 71c761
+            }
Mark Wielaard 71c761
+         }
Mark Wielaard 71c761
+      }
Mark Wielaard 71c761
+   }
Mark Wielaard 71c761
+}
Mark Wielaard 71c761
+POST(sys_pselect6)
Mark Wielaard 71c761
+{
Mark Wielaard 71c761
+   if (ARG6 != 0 && ARG6 != 1) {
Mark Wielaard 71c761
+       VG_(free)((struct pselect_adjusted_sigset *)ARG6);
Mark Wielaard 71c761
+   }
Mark Wielaard 71c761
 }
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 PRE(sys_ppoll)
Mark Wielaard 71c761
 {
Mark Wielaard 71c761
    UInt i;
Mark Wielaard 71c761
    struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
Mark Wielaard 71c761
-   *flags |= SfMayBlock;
Mark Wielaard 71c761
+   *flags |= SfMayBlock | SfPostOnFail;
Mark Wielaard 71c761
    PRINT("sys_ppoll ( %#lx, %lu, %#lx, %#lx, %lu )\n", ARG1,ARG2,ARG3,ARG4,ARG5);
Mark Wielaard 71c761
    PRE_REG_READ5(long, "ppoll",
Mark Wielaard 71c761
                  struct vki_pollfd *, ufds, unsigned int, nfds,
Mark Wielaard 71c761
@@ -1319,18 +1355,33 @@ PRE(sys_ppoll)
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    if (ARG3)
Mark Wielaard 71c761
       PRE_MEM_READ( "ppoll(tsp)", ARG3, sizeof(struct vki_timespec) );
Mark Wielaard 71c761
-   if (ARG4)
Mark Wielaard 71c761
-      PRE_MEM_READ( "ppoll(sigmask)", ARG4, sizeof(vki_sigset_t) );
Mark Wielaard 71c761
+   if (ARG4 != 0 && sizeof(vki_sigset_t) == ARG5) {
Mark Wielaard 71c761
+      const vki_sigset_t *guest_sigmask = (vki_sigset_t *)ARG4;
Mark Wielaard 71c761
+      PRE_MEM_READ( "ppoll(sigmask)", ARG4, ARG5);
Mark Wielaard 71c761
+      if (!ML_(safe_to_deref)(guest_sigmask, sizeof(*guest_sigmask))) {
Mark Wielaard 71c761
+         ARG4 = 1; /* Something recognisable to POST() hook. */
Mark Wielaard 71c761
+      } else {
Mark Wielaard 71c761
+         vki_sigset_t *vg_sigmask =
Mark Wielaard 71c761
+             VG_(malloc)("syswrap.ppoll.1", sizeof(*vg_sigmask));
Mark Wielaard 71c761
+         ARG4 = (Addr)vg_sigmask;
Mark Wielaard 71c761
+         *vg_sigmask = *guest_sigmask;
Mark Wielaard 71c761
+         VG_(sanitize_client_sigmask)(vg_sigmask);
Mark Wielaard 71c761
+      }
Mark Wielaard 71c761
+   }
Mark Wielaard 71c761
 }
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 POST(sys_ppoll)
Mark Wielaard 71c761
 {
Mark Wielaard 71c761
-   if (RES > 0) {
Mark Wielaard 71c761
+   vg_assert(SUCCESS || FAILURE);
Mark Wielaard 71c761
+   if (SUCCESS && (RES >= 0)) {
Mark Wielaard 71c761
       UInt i;
Mark Wielaard 71c761
       struct vki_pollfd* ufds = (struct vki_pollfd *)ARG1;
Mark Wielaard 71c761
       for (i = 0; i < ARG2; i++)
Mark Wielaard 71c761
 	 POST_MEM_WRITE( (Addr)(&ufds[i].revents), sizeof(ufds[i].revents) );
Mark Wielaard 71c761
    }
Mark Wielaard 71c761
+   if (ARG4 != 0 && ARG5 == sizeof(vki_sigset_t) && ARG4 != 1) {
Mark Wielaard 71c761
+      VG_(free)((vki_sigset_t *) ARG4);
Mark Wielaard 71c761
+   }
Mark Wielaard 71c761
 }
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-main.c b/coregrind/m_syswrap/syswrap-main.c
Mark Wielaard 71c761
index 054891f..d854194 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-main.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-main.c
Mark Wielaard 71c761
@@ -1657,7 +1657,7 @@ static const SyscallTableEntry* get_syscall_entry ( Int syscallno )
Mark Wielaard 71c761
 /* Add and remove signals from mask so that we end up telling the
Mark Wielaard 71c761
    kernel the state we actually want rather than what the client
Mark Wielaard 71c761
    wants. */
Mark Wielaard 71c761
-static void sanitize_client_sigmask(vki_sigset_t *mask)
Mark Wielaard 71c761
+void VG_(sanitize_client_sigmask)(vki_sigset_t *mask)
Mark Wielaard 71c761
 {
Mark Wielaard 71c761
    VG_(sigdelset)(mask, VKI_SIGKILL);
Mark Wielaard 71c761
    VG_(sigdelset)(mask, VKI_SIGSTOP);
Mark Wielaard 71c761
@@ -1979,7 +1979,7 @@ void VG_(client_syscall) ( ThreadId tid, UInt trc )
Mark Wielaard 71c761
          PRINT(" --> [async] ... \n");
Mark Wielaard 71c761
 
Mark Wielaard 71c761
          mask = tst->sig_mask;
Mark Wielaard 71c761
-         sanitize_client_sigmask(&mask);
Mark Wielaard 71c761
+         VG_(sanitize_client_sigmask)(&mask);
Mark Wielaard 71c761
 
Mark Wielaard 71c761
          /* Gack.  More impedance matching.  Copy the possibly
Mark Wielaard 71c761
             modified syscall args back into the guest state. */
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-mips64-linux.c b/coregrind/m_syswrap/syswrap-mips64-linux.c
Mark Wielaard 71c761
index 12d147d..7c5fbdb 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-mips64-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-mips64-linux.c
Mark Wielaard 71c761
@@ -889,7 +889,7 @@ static SyscallTableEntry syscall_main_table[] = {
Mark Wielaard 71c761
    LINX_ (__NR_readlinkat, sys_readlinkat),
Mark Wielaard 71c761
    LINX_ (__NR_fchmodat, sys_fchmodat),
Mark Wielaard 71c761
    LINX_ (__NR_faccessat, sys_faccessat),
Mark Wielaard 71c761
-   LINX_ (__NR_pselect6, sys_pselect6),
Mark Wielaard 71c761
+   LINXY (__NR_pselect6, sys_pselect6),
Mark Wielaard 71c761
    LINXY (__NR_ppoll, sys_ppoll),
Mark Wielaard 71c761
    PLAX_ (__NR_unshare, sys_unshare),
Mark Wielaard 71c761
    PLAX_ (__NR_splice, sys_splice),
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c
Mark Wielaard 71c761
index 9ceaa15..379fcb3 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-ppc32-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c
Mark Wielaard 71c761
@@ -1194,7 +1194,7 @@ static SyscallTableEntry syscall_table[] = {
Mark Wielaard 71c761
    PLAXY(__NR_spu_run,            sys_spu_run),               // 278
Mark Wielaard 71c761
    PLAX_(__NR_spu_create,         sys_spu_create),            // 279
Mark Wielaard 71c761
 
Mark Wielaard 71c761
-   LINX_(__NR_pselect6,          sys_pselect6),          // 280
Mark Wielaard 71c761
+   LINXY(__NR_pselect6,          sys_pselect6),          // 280
Mark Wielaard 71c761
    LINXY(__NR_ppoll,             sys_ppoll),             // 281
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    LINXY(__NR_openat,            sys_openat),            // 286
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c
Mark Wielaard 71c761
index 15b8979..77668c7 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-ppc64-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c
Mark Wielaard 71c761
@@ -1110,7 +1110,7 @@ static SyscallTableEntry syscall_table[] = {
Mark Wielaard 71c761
    LINX_(__NR_inotify_add_watch,  sys_inotify_add_watch), // 276
Mark Wielaard 71c761
    LINX_(__NR_inotify_rm_watch,   sys_inotify_rm_watch),  // 277
Mark Wielaard 71c761
 
Mark Wielaard 71c761
-   LINX_(__NR_pselect6,          sys_pselect6),           // 280
Mark Wielaard 71c761
+   LINXY(__NR_pselect6,          sys_pselect6),           // 280
Mark Wielaard 71c761
    LINXY(__NR_ppoll,             sys_ppoll),              // 281
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    LINXY(__NR_openat,            sys_openat),             // 286
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-s390x-linux.c b/coregrind/m_syswrap/syswrap-s390x-linux.c
Mark Wielaard 71c761
index 0513789..107a569 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-s390x-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-s390x-linux.c
Mark Wielaard 71c761
@@ -992,7 +992,7 @@ static SyscallTableEntry syscall_table[] = {
Mark Wielaard 71c761
    LINX_(__NR_fchmodat,  sys_fchmodat),                               // 299
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    LINX_(__NR_faccessat,  sys_faccessat),                             // 300
Mark Wielaard 71c761
-   LINX_(__NR_pselect6, sys_pselect6),                                // 301
Mark Wielaard 71c761
+   LINXY(__NR_pselect6, sys_pselect6),                                // 301
Mark Wielaard 71c761
    LINXY(__NR_ppoll, sys_ppoll),                                      // 302
Mark Wielaard 71c761
    LINX_(__NR_unshare, sys_unshare),                                  // 303
Mark Wielaard 71c761
    LINX_(__NR_set_robust_list,  sys_set_robust_list),                 // 304
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-solaris.c b/coregrind/m_syswrap/syswrap-solaris.c
Mark Wielaard 71c761
index 7ac876f..a307f6c 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-solaris.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-solaris.c
Mark Wielaard 71c761
@@ -71,6 +71,7 @@
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 #include "priv_types_n_macros.h"
Mark Wielaard 71c761
 #include "priv_syswrap-generic.h"
Mark Wielaard 71c761
+#include "priv_syswrap-main.h"
Mark Wielaard 71c761
 #include "priv_syswrap-solaris.h"
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 /* Return the number of non-dead and daemon threads.
Mark Wielaard 71c761
@@ -7327,7 +7328,7 @@ PRE(sys_pollsys)
Mark Wielaard 71c761
    UWord i;
Mark Wielaard 71c761
    struct vki_pollfd *ufds = (struct vki_pollfd *)ARG1;
Mark Wielaard 71c761
 
Mark Wielaard 71c761
-   *flags |= SfMayBlock;
Mark Wielaard 71c761
+   *flags |= SfMayBlock | SfPostOnFail;
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    PRINT("sys_pollsys ( %#lx, %lu, %#lx, %#lx )", ARG1, ARG2, ARG3, ARG4);
Mark Wielaard 71c761
    PRE_REG_READ4(long, "poll", pollfd_t *, fds, vki_nfds_t, nfds,
Mark Wielaard 71c761
@@ -7343,18 +7344,37 @@ PRE(sys_pollsys)
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    if (ARG3)
Mark Wielaard 71c761
       PRE_MEM_READ("poll(timeout)", ARG3, sizeof(vki_timespec_t));
Mark Wielaard 71c761
-   if (ARG4)
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+   if (ARG4) {
Mark Wielaard 71c761
       PRE_MEM_READ("poll(set)", ARG4, sizeof(vki_sigset_t));
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+      const vki_sigset_t *guest_sigmask = (vki_sigset_t *) ARG4;
Mark Wielaard 71c761
+      if (!ML_(safe_to_deref)(guest_sigmask, sizeof(vki_sigset_t))) {
Mark Wielaard 71c761
+         ARG4 = 1; /* Something recognisable to POST() hook. */
Mark Wielaard 71c761
+      } else {
Mark Wielaard 71c761
+         vki_sigset_t *vg_sigmask =
Mark Wielaard 71c761
+            VG_(malloc)("syswrap.pollsys.1", sizeof(vki_sigset_t));
Mark Wielaard 71c761
+         ARG4 = (Addr) vg_sigmask;
Mark Wielaard 71c761
+         *vg_sigmask = *guest_sigmask;
Mark Wielaard 71c761
+         VG_(sanitize_client_sigmask)(vg_sigmask);
Mark Wielaard 71c761
+      }
Mark Wielaard 71c761
+   }
Mark Wielaard 71c761
 }
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 POST(sys_pollsys)
Mark Wielaard 71c761
 {
Mark Wielaard 71c761
-   if (RES >= 0) {
Mark Wielaard 71c761
+   vg_assert(SUCCESS || FAILURE);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+   if (SUCCESS && (RES >= 0)) {
Mark Wielaard 71c761
       UWord i;
Mark Wielaard 71c761
       vki_pollfd_t *ufds = (vki_pollfd_t*)ARG1;
Mark Wielaard 71c761
       for (i = 0; i < ARG2; i++)
Mark Wielaard 71c761
          POST_FIELD_WRITE(ufds[i].revents);
Mark Wielaard 71c761
    }
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+   if ((ARG4 != 0) && (ARG4 != 1)) {
Mark Wielaard 71c761
+      VG_(free)((vki_sigset_t *) ARG4);
Mark Wielaard 71c761
+   }
Mark Wielaard 71c761
 }
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 PRE(sys_labelsys)
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-tilegx-linux.c b/coregrind/m_syswrap/syswrap-tilegx-linux.c
Mark Wielaard 71c761
index aceceb4..4845f79 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-tilegx-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-tilegx-linux.c
Mark Wielaard 71c761
@@ -1202,7 +1202,7 @@ static SyscallTableEntry syscall_table[] = {
Mark Wielaard 71c761
   LINXY(__NR_preadv,            sys_preadv),               // 69
Mark Wielaard 71c761
   LINX_(__NR_pwritev,           sys_pwritev),              // 70
Mark Wielaard 71c761
   LINXY(__NR_sendfile,          sys_sendfile),             // 71
Mark Wielaard 71c761
-  LINX_(__NR_pselect6,          sys_pselect6),             // 72
Mark Wielaard 71c761
+  LINXY(__NR_pselect6,          sys_pselect6),             // 72
Mark Wielaard 71c761
   LINXY(__NR_ppoll,             sys_ppoll),                // 73
Mark Wielaard 71c761
   LINXY(__NR_signalfd4,         sys_signalfd4),            // 74
Mark Wielaard 71c761
   LINX_(__NR_splice,            sys_splice),               // 75
Mark Wielaard 71c761
diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard 71c761
index 3c80e6a..f1f97d7 100644
Mark Wielaard 71c761
--- a/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard 71c761
+++ b/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard 71c761
@@ -1766,7 +1766,7 @@ static SyscallTableEntry syscall_table[] = {
Mark Wielaard 71c761
    LINX_(__NR_readlinkat,	 sys_readlinkat),       // 305
Mark Wielaard 71c761
    LINX_(__NR_fchmodat,		 sys_fchmodat),         // 306
Mark Wielaard 71c761
    LINX_(__NR_faccessat,	 sys_faccessat),        // 307
Mark Wielaard 71c761
-   LINX_(__NR_pselect6,		 sys_pselect6),         // 308
Mark Wielaard 71c761
+   LINXY(__NR_pselect6,		 sys_pselect6),         // 308
Mark Wielaard 71c761
    LINXY(__NR_ppoll,		 sys_ppoll),            // 309
Mark Wielaard 71c761
 
Mark Wielaard 71c761
    LINX_(__NR_unshare,		 sys_unshare),          // 310
Mark Wielaard 71c761
diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am
Mark Wielaard 71c761
index 7eb2bf8..5d8e942 100644
Mark Wielaard 71c761
--- a/none/tests/Makefile.am
Mark Wielaard 71c761
+++ b/none/tests/Makefile.am
Mark Wielaard 71c761
@@ -142,12 +142,14 @@ EXTRA_DIST = \
Mark Wielaard 71c761
 	nestedfns.stderr.exp nestedfns.stdout.exp nestedfns.vgtest \
Mark Wielaard 71c761
 	nodir.stderr.exp nodir.vgtest \
Mark Wielaard 71c761
 	pending.stdout.exp pending.stderr.exp pending.vgtest \
Mark Wielaard 71c761
+	ppoll_alarm.stdout.exp ppoll_alarm.stderr.exp ppoll_alarm.vgtest \
Mark Wielaard 71c761
 	procfs-linux.stderr.exp-with-readlinkat \
Mark Wielaard 71c761
 	procfs-linux.stderr.exp-without-readlinkat \
Mark Wielaard 71c761
 	procfs-linux.vgtest \
Mark Wielaard 71c761
 	procfs-non-linux.vgtest \
Mark Wielaard 71c761
 	procfs-non-linux.stderr.exp-with-readlinkat \
Mark Wielaard 71c761
 	procfs-non-linux.stderr.exp-without-readlinkat \
Mark Wielaard 71c761
+	pselect_alarm.stdout.exp pselect_alarm.stderr.exp pselect_alarm.vgtest \
Mark Wielaard 71c761
 	pth_atfork1.stderr.exp pth_atfork1.stdout.exp pth_atfork1.vgtest \
Mark Wielaard 71c761
 	pth_blockedsig.stderr.exp \
Mark Wielaard 71c761
 	pth_blockedsig.stdout.exp pth_blockedsig.vgtest \
Mark Wielaard 71c761
@@ -215,7 +217,9 @@ check_PROGRAMS = \
Mark Wielaard 71c761
 	mmap_fcntl_bug \
Mark Wielaard 71c761
 	munmap_exe map_unaligned map_unmap mq \
Mark Wielaard 71c761
 	pending \
Mark Wielaard 71c761
+	ppoll_alarm \
Mark Wielaard 71c761
 	procfs-cmdline-exe \
Mark Wielaard 71c761
+	pselect_alarm \
Mark Wielaard 71c761
 	pth_atfork1 pth_blockedsig pth_cancel1 pth_cancel2 pth_cvsimple \
Mark Wielaard 71c761
 	pth_empty pth_exit pth_exit2 pth_mutexspeed pth_once pth_rwlock \
Mark Wielaard 71c761
 	pth_stackalign \
Mark Wielaard 71c761
@@ -289,6 +293,8 @@ libvexmultiarch_test_LDADD = \
Mark Wielaard 71c761
 	../../VEX/libvexmultiarch-@VGCONF_ARCH_PRI@-@VGCONF_OS@.a \
Mark Wielaard 71c761
 	../../VEX/libvex-@VGCONF_ARCH_PRI@-@VGCONF_OS@.a @LIB_UBSAN@
Mark Wielaard 71c761
 libvexmultiarch_test_SOURCES = libvex_test.c
Mark Wielaard 71c761
+ppoll_alarm_LDADD	= -lpthread
Mark Wielaard 71c761
+pselect_alarm_LDADD	= -lpthread
Mark Wielaard 71c761
 pth_atfork1_LDADD	= -lpthread
Mark Wielaard 71c761
 pth_blockedsig_LDADD	= -lpthread
Mark Wielaard 71c761
 pth_cancel1_CFLAGS	= $(AM_CFLAGS) -Wno-shadow
Mark Wielaard 71c761
diff --git a/none/tests/ppoll_alarm.c b/none/tests/ppoll_alarm.c
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..1b1794b
Mark Wielaard 71c761
--- /dev/null
Mark Wielaard 71c761
+++ b/none/tests/ppoll_alarm.c
Mark Wielaard 71c761
@@ -0,0 +1,55 @@
Mark Wielaard 71c761
+/* Tries to exploit bug in ppoll mask handling:
Mark Wielaard 71c761
+   https://bugs.kde.org/show_bug.cgi?id=359871
Mark Wielaard 71c761
+   where client program was able to successfully block VG_SIGVGKILL. */
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+#define _GNU_SOURCE /* for ppoll */
Mark Wielaard 71c761
+#include <poll.h>
Mark Wielaard 71c761
+#include <pthread.h>
Mark Wielaard 71c761
+#include <signal.h>
Mark Wielaard 71c761
+#include <stdio.h>
Mark Wielaard 71c761
+#include <unistd.h>
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+static int ready = 0;
Mark Wielaard 71c761
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Mark Wielaard 71c761
+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+static void *
Mark Wielaard 71c761
+mythr(void *ignore)
Mark Wielaard 71c761
+{
Mark Wielaard 71c761
+    pthread_mutex_lock(&mutex);
Mark Wielaard 71c761
+    ready = 1;
Mark Wielaard 71c761
+    pthread_cond_signal(&cond;;
Mark Wielaard 71c761
+    pthread_mutex_unlock(&mutex);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    sigset_t ss;
Mark Wielaard 71c761
+    sigfillset(&ss);
Mark Wielaard 71c761
+    while (1) {
Mark Wielaard 71c761
+        struct timespec ts = {10000, 0};
Mark Wielaard 71c761
+        ppoll(NULL, 0, &ts, &ss);
Mark Wielaard 71c761
+    }
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    return NULL;
Mark Wielaard 71c761
+}
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+int
Mark Wielaard 71c761
+main()
Mark Wielaard 71c761
+{
Mark Wielaard 71c761
+    pthread_t thr;
Mark Wielaard 71c761
+    int ret = pthread_create(&thr, NULL, mythr, NULL);
Mark Wielaard 71c761
+    if (ret != 0) {
Mark Wielaard 71c761
+        fprintf(stderr, "pthread_create failed\n");
Mark Wielaard 71c761
+        return 1;
Mark Wielaard 71c761
+    }
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    pthread_mutex_lock(&mutex);
Mark Wielaard 71c761
+    while (ready == 0) {
Mark Wielaard 71c761
+        pthread_cond_wait(&cond, &mutex);
Mark Wielaard 71c761
+    }
Mark Wielaard 71c761
+    pthread_mutex_unlock(&mutex);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    alarm(1); /* Unhandled SIGALRM should cause exit. */
Mark Wielaard 71c761
+    while (1)
Mark Wielaard 71c761
+        sleep(1);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    return 0;
Mark Wielaard 71c761
+}
Mark Wielaard 71c761
diff --git a/none/tests/ppoll_alarm.stderr.exp b/none/tests/ppoll_alarm.stderr.exp
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..e69de29
Mark Wielaard 71c761
diff --git a/none/tests/ppoll_alarm.stdout.exp b/none/tests/ppoll_alarm.stdout.exp
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..e69de29
Mark Wielaard 71c761
diff --git a/none/tests/ppoll_alarm.vgtest b/none/tests/ppoll_alarm.vgtest
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..b1309d3
Mark Wielaard 71c761
--- /dev/null
Mark Wielaard 71c761
+++ b/none/tests/ppoll_alarm.vgtest
Mark Wielaard 71c761
@@ -0,0 +1,3 @@
Mark Wielaard 71c761
+prog: ppoll_alarm
Mark Wielaard 71c761
+vgopts: -q
Mark Wielaard 71c761
+stderr_filter: filter_stderr
Mark Wielaard 71c761
diff --git a/none/tests/pselect_alarm.c b/none/tests/pselect_alarm.c
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..7a68ec0
Mark Wielaard 71c761
--- /dev/null
Mark Wielaard 71c761
+++ b/none/tests/pselect_alarm.c
Mark Wielaard 71c761
@@ -0,0 +1,61 @@
Mark Wielaard 71c761
+/* Tries to exploit bug in pselect mask handling:
Mark Wielaard 71c761
+   https://bugs.kde.org/show_bug.cgi?id=359871
Mark Wielaard 71c761
+   where client program was able to successfully block VG_SIGVGKILL. */
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+#include <sys/select.h>
Mark Wielaard 71c761
+#include <assert.h>
Mark Wielaard 71c761
+#include <errno.h>
Mark Wielaard 71c761
+#include <pthread.h>
Mark Wielaard 71c761
+#include <signal.h>
Mark Wielaard 71c761
+#include <stdio.h>
Mark Wielaard 71c761
+#include <unistd.h>
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+static int ready = 0;
Mark Wielaard 71c761
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Mark Wielaard 71c761
+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+static void *
Mark Wielaard 71c761
+mythr(void *ignore)
Mark Wielaard 71c761
+{
Mark Wielaard 71c761
+    pthread_mutex_lock(&mutex);
Mark Wielaard 71c761
+    ready = 1;
Mark Wielaard 71c761
+    pthread_cond_signal(&cond;;
Mark Wielaard 71c761
+    pthread_mutex_unlock(&mutex);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    sigset_t ss;
Mark Wielaard 71c761
+    sigfillset(&ss);
Mark Wielaard 71c761
+    while (1) {
Mark Wielaard 71c761
+        struct timespec ts = {10000, 0};
Mark Wielaard 71c761
+        pselect(0, NULL, NULL, NULL, &ts, &ss);
Mark Wielaard 71c761
+    }
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    return NULL;
Mark Wielaard 71c761
+}
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+int
Mark Wielaard 71c761
+main()
Mark Wielaard 71c761
+{
Mark Wielaard 71c761
+    pthread_t thr;
Mark Wielaard 71c761
+    int ret = pthread_create(&thr, NULL, mythr, NULL);
Mark Wielaard 71c761
+    if (ret != 0) {
Mark Wielaard 71c761
+        fprintf(stderr, "pthread_create failed\n");
Mark Wielaard 71c761
+        return 1;
Mark Wielaard 71c761
+    }
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    pthread_mutex_lock(&mutex);
Mark Wielaard 71c761
+    while (ready == 0) {
Mark Wielaard 71c761
+        pthread_cond_wait(&cond, &mutex);
Mark Wielaard 71c761
+    }
Mark Wielaard 71c761
+    pthread_mutex_unlock(&mutex);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+#if defined(VGO_linux)
Mark Wielaard 71c761
+    assert(pselect(0, NULL, NULL, NULL, NULL, (sigset_t *)12) == -1);
Mark Wielaard 71c761
+    assert(errno == EFAULT);
Mark Wielaard 71c761
+#endif
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    alarm(1); /* Unhandled SIGALRM should cause exit. */
Mark Wielaard 71c761
+    while (1)
Mark Wielaard 71c761
+        sleep(1);
Mark Wielaard 71c761
+
Mark Wielaard 71c761
+    return 0;
Mark Wielaard 71c761
+}
Mark Wielaard 71c761
diff --git a/none/tests/pselect_alarm.stderr.exp b/none/tests/pselect_alarm.stderr.exp
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..e69de29
Mark Wielaard 71c761
diff --git a/none/tests/pselect_alarm.stdout.exp b/none/tests/pselect_alarm.stdout.exp
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..e69de29
Mark Wielaard 71c761
diff --git a/none/tests/pselect_alarm.vgtest b/none/tests/pselect_alarm.vgtest
Mark Wielaard 71c761
new file mode 100644
Mark Wielaard 71c761
index 0000000..84cc674
Mark Wielaard 71c761
--- /dev/null
Mark Wielaard 71c761
+++ b/none/tests/pselect_alarm.vgtest
Mark Wielaard 71c761
@@ -0,0 +1,3 @@
Mark Wielaard 71c761
+prog: pselect_alarm
Mark Wielaard 71c761
+vgopts: -q
Mark Wielaard 71c761
+stderr_filter: filter_stderr
Mark Wielaard 71c761
diff --git a/tests/filter_stderr_basic b/tests/filter_stderr_basic
Mark Wielaard 71c761
index 472cd8f..4b6e480 100755
Mark Wielaard 71c761
--- a/tests/filter_stderr_basic
Mark Wielaard 71c761
+++ b/tests/filter_stderr_basic
Mark Wielaard 71c761
@@ -46,7 +46,7 @@ sed "/warning: line info addresses out of order/d" |
Mark Wielaard 71c761
 # of the bash process. Newer bash versions redirect such messages properly.
Mark Wielaard 71c761
 # Suppress any redirected abnormal termination messages. You can find the
Mark Wielaard 71c761
 # complete list of messages in the bash source file siglist.c.
Mark Wielaard 71c761
-perl -n -e 'print if !/^(Segmentation fault|Alarm clock|Aborted|Bus error)( \(core dumped\))?$/' |
Mark Wielaard 71c761
+perl -n -e 'print if !/^(Segmentation fault|Alarm clock|Aborted|Bus error|Killed)( \(core dumped\))?$/' |
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 # Similar as above, but for ksh on Solaris/illumos.
Mark Wielaard 71c761
 perl -n -e 'print if !/^(Memory fault|Killed) $/' |
Mark Wielaard 71c761
Only in valgrind-3.11.0: autom4te.cache
Mark Wielaard 71c761
diff -ru valgrind-3.11.0.orig/none/tests/Makefile.in valgrind-3.11.0/none/tests/Makefile.in
Mark Wielaard 71c761
--- valgrind-3.11.0.orig/none/tests/Makefile.in	2016-03-09 20:07:53.451112914 +0100
Mark Wielaard 71c761
+++ valgrind-3.11.0/none/tests/Makefile.in	2016-03-09 20:09:44.281584703 +0100
Mark Wielaard 71c761
@@ -151,7 +151,8 @@
Mark Wielaard 71c761
 	libvexmultiarch_test$(EXEEXT) manythreads$(EXEEXT) \
Mark Wielaard 71c761
 	mmap_fcntl_bug$(EXEEXT) munmap_exe$(EXEEXT) \
Mark Wielaard 71c761
 	map_unaligned$(EXEEXT) map_unmap$(EXEEXT) mq$(EXEEXT) \
Mark Wielaard 71c761
-	pending$(EXEEXT) procfs-cmdline-exe$(EXEEXT) \
Mark Wielaard 71c761
+	pending$(EXEEXT) ppoll_alarm$(EXEEXT) \
Mark Wielaard 71c761
+	procfs-cmdline-exe$(EXEEXT) pselect_alarm$(EXEEXT) \
Mark Wielaard 71c761
 	pth_atfork1$(EXEEXT) pth_blockedsig$(EXEEXT) \
Mark Wielaard 71c761
 	pth_cancel1$(EXEEXT) pth_cancel2$(EXEEXT) \
Mark Wielaard 71c761
 	pth_cvsimple$(EXEEXT) pth_empty$(EXEEXT) pth_exit$(EXEEXT) \
Mark Wielaard 71c761
@@ -329,12 +330,18 @@
Mark Wielaard 71c761
 pending_SOURCES = pending.c
Mark Wielaard 71c761
 pending_OBJECTS = pending.$(OBJEXT)
Mark Wielaard 71c761
 pending_LDADD = $(LDADD)
Mark Wielaard 71c761
+ppoll_alarm_SOURCES = ppoll_alarm.c
Mark Wielaard 71c761
+ppoll_alarm_OBJECTS = ppoll_alarm.$(OBJEXT)
Mark Wielaard 71c761
+ppoll_alarm_DEPENDENCIES =
Mark Wielaard 71c761
 process_vm_readv_writev_SOURCES = process_vm_readv_writev.c
Mark Wielaard 71c761
 process_vm_readv_writev_OBJECTS = process_vm_readv_writev.$(OBJEXT)
Mark Wielaard 71c761
 process_vm_readv_writev_LDADD = $(LDADD)
Mark Wielaard 71c761
 procfs_cmdline_exe_SOURCES = procfs-cmdline-exe.c
Mark Wielaard 71c761
 procfs_cmdline_exe_OBJECTS = procfs-cmdline-exe.$(OBJEXT)
Mark Wielaard 71c761
 procfs_cmdline_exe_LDADD = $(LDADD)
Mark Wielaard 71c761
+pselect_alarm_SOURCES = pselect_alarm.c
Mark Wielaard 71c761
+pselect_alarm_OBJECTS = pselect_alarm.$(OBJEXT)
Mark Wielaard 71c761
+pselect_alarm_DEPENDENCIES =
Mark Wielaard 71c761
 pth_atfork1_SOURCES = pth_atfork1.c
Mark Wielaard 71c761
 pth_atfork1_OBJECTS = pth_atfork1.$(OBJEXT)
Mark Wielaard 71c761
 pth_atfork1_DEPENDENCIES =
Mark Wielaard 71c761
@@ -527,18 +534,18 @@
Mark Wielaard 71c761
 	$(gxx304_SOURCES) ifunc.c ioctl_moans.c libvex_test.c \
Mark Wielaard 71c761
 	$(libvexmultiarch_test_SOURCES) manythreads.c map_unaligned.c \
Mark Wielaard 71c761
 	map_unmap.c mmap_fcntl_bug.c mq.c munmap_exe.c nestedfns.c \
Mark Wielaard 71c761
-	pending.c process_vm_readv_writev.c procfs-cmdline-exe.c \
Mark Wielaard 71c761
-	pth_atfork1.c pth_blockedsig.c pth_cancel1.c pth_cancel2.c \
Mark Wielaard 71c761
-	pth_cvsimple.c pth_empty.c pth_exit.c pth_exit2.c \
Mark Wielaard 71c761
-	pth_mutexspeed.c pth_once.c pth_rwlock.c pth_stackalign.c \
Mark Wielaard 71c761
-	rcrl.c readline1.c require-text-symbol.c res_search.c resolv.c \
Mark Wielaard 71c761
-	rlimit64_nofile.c rlimit_nofile.c selfrun.c sem.c semlimit.c \
Mark Wielaard 71c761
-	sha1_test.c shortpush.c shorts.c sigstackgrowth.c \
Mark Wielaard 71c761
-	stackgrowth.c syscall-restart1.c syscall-restart2.c syslog.c \
Mark Wielaard 71c761
-	system.c thread-exits.c threaded-fork.c threadederrno.c \
Mark Wielaard 71c761
-	timestamp.c $(tls_SOURCES) $(tls_so_SOURCES) \
Mark Wielaard 71c761
-	$(tls2_so_SOURCES) unit_debuglog.c \
Mark Wielaard 71c761
-	$(valgrind_cpp_test_SOURCES) vgprintf.c
Mark Wielaard 71c761
+	pending.c ppoll_alarm.c process_vm_readv_writev.c \
Mark Wielaard 71c761
+	procfs-cmdline-exe.c pselect_alarm.c pth_atfork1.c \
Mark Wielaard 71c761
+	pth_blockedsig.c pth_cancel1.c pth_cancel2.c pth_cvsimple.c \
Mark Wielaard 71c761
+	pth_empty.c pth_exit.c pth_exit2.c pth_mutexspeed.c pth_once.c \
Mark Wielaard 71c761
+	pth_rwlock.c pth_stackalign.c rcrl.c readline1.c \
Mark Wielaard 71c761
+	require-text-symbol.c res_search.c resolv.c rlimit64_nofile.c \
Mark Wielaard 71c761
+	rlimit_nofile.c selfrun.c sem.c semlimit.c sha1_test.c \
Mark Wielaard 71c761
+	shortpush.c shorts.c sigstackgrowth.c stackgrowth.c \
Mark Wielaard 71c761
+	syscall-restart1.c syscall-restart2.c syslog.c system.c \
Mark Wielaard 71c761
+	thread-exits.c threaded-fork.c threadederrno.c timestamp.c \
Mark Wielaard 71c761
+	$(tls_SOURCES) $(tls_so_SOURCES) $(tls2_so_SOURCES) \
Mark Wielaard 71c761
+	unit_debuglog.c $(valgrind_cpp_test_SOURCES) vgprintf.c
Mark Wielaard 71c761
 DIST_SOURCES = ansi.c args.c async-sigs.c bitfield1.c bug129866.c \
Mark Wielaard 71c761
 	bug234814.c closeall.c $(coolo_sigaction_SOURCES) \
Mark Wielaard 71c761
 	coolo_strlen.c discard.c exec-sigmask.c execve.c faultstatus.c \
Mark Wielaard 71c761
@@ -548,18 +555,18 @@
Mark Wielaard 71c761
 	$(gxx304_SOURCES) ifunc.c ioctl_moans.c libvex_test.c \
Mark Wielaard 71c761
 	$(libvexmultiarch_test_SOURCES) manythreads.c map_unaligned.c \
Mark Wielaard 71c761
 	map_unmap.c mmap_fcntl_bug.c mq.c munmap_exe.c nestedfns.c \
Mark Wielaard 71c761
-	pending.c process_vm_readv_writev.c procfs-cmdline-exe.c \
Mark Wielaard 71c761
-	pth_atfork1.c pth_blockedsig.c pth_cancel1.c pth_cancel2.c \
Mark Wielaard 71c761
-	pth_cvsimple.c pth_empty.c pth_exit.c pth_exit2.c \
Mark Wielaard 71c761
-	pth_mutexspeed.c pth_once.c pth_rwlock.c pth_stackalign.c \
Mark Wielaard 71c761
-	rcrl.c readline1.c require-text-symbol.c res_search.c resolv.c \
Mark Wielaard 71c761
-	rlimit64_nofile.c rlimit_nofile.c selfrun.c sem.c semlimit.c \
Mark Wielaard 71c761
-	sha1_test.c shortpush.c shorts.c sigstackgrowth.c \
Mark Wielaard 71c761
-	stackgrowth.c syscall-restart1.c syscall-restart2.c syslog.c \
Mark Wielaard 71c761
-	system.c thread-exits.c threaded-fork.c threadederrno.c \
Mark Wielaard 71c761
-	timestamp.c $(tls_SOURCES) $(tls_so_SOURCES) \
Mark Wielaard 71c761
-	$(tls2_so_SOURCES) unit_debuglog.c \
Mark Wielaard 71c761
-	$(valgrind_cpp_test_SOURCES) vgprintf.c
Mark Wielaard 71c761
+	pending.c ppoll_alarm.c process_vm_readv_writev.c \
Mark Wielaard 71c761
+	procfs-cmdline-exe.c pselect_alarm.c pth_atfork1.c \
Mark Wielaard 71c761
+	pth_blockedsig.c pth_cancel1.c pth_cancel2.c pth_cvsimple.c \
Mark Wielaard 71c761
+	pth_empty.c pth_exit.c pth_exit2.c pth_mutexspeed.c pth_once.c \
Mark Wielaard 71c761
+	pth_rwlock.c pth_stackalign.c rcrl.c readline1.c \
Mark Wielaard 71c761
+	require-text-symbol.c res_search.c resolv.c rlimit64_nofile.c \
Mark Wielaard 71c761
+	rlimit_nofile.c selfrun.c sem.c semlimit.c sha1_test.c \
Mark Wielaard 71c761
+	shortpush.c shorts.c sigstackgrowth.c stackgrowth.c \
Mark Wielaard 71c761
+	syscall-restart1.c syscall-restart2.c syslog.c system.c \
Mark Wielaard 71c761
+	thread-exits.c threaded-fork.c threadederrno.c timestamp.c \
Mark Wielaard 71c761
+	$(tls_SOURCES) $(tls_so_SOURCES) $(tls2_so_SOURCES) \
Mark Wielaard 71c761
+	unit_debuglog.c $(valgrind_cpp_test_SOURCES) vgprintf.c
Mark Wielaard 71c761
 RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
Mark Wielaard 71c761
 	ctags-recursive dvi-recursive html-recursive info-recursive \
Mark Wielaard 71c761
 	install-data-recursive install-dvi-recursive \
Mark Wielaard 71c761
@@ -1072,12 +1079,14 @@
Mark Wielaard 71c761
 	nestedfns.stderr.exp nestedfns.stdout.exp nestedfns.vgtest \
Mark Wielaard 71c761
 	nodir.stderr.exp nodir.vgtest \
Mark Wielaard 71c761
 	pending.stdout.exp pending.stderr.exp pending.vgtest \
Mark Wielaard 71c761
+	ppoll_alarm.stdout.exp ppoll_alarm.stderr.exp ppoll_alarm.vgtest \
Mark Wielaard 71c761
 	procfs-linux.stderr.exp-with-readlinkat \
Mark Wielaard 71c761
 	procfs-linux.stderr.exp-without-readlinkat \
Mark Wielaard 71c761
 	procfs-linux.vgtest \
Mark Wielaard 71c761
 	procfs-non-linux.vgtest \
Mark Wielaard 71c761
 	procfs-non-linux.stderr.exp-with-readlinkat \
Mark Wielaard 71c761
 	procfs-non-linux.stderr.exp-without-readlinkat \
Mark Wielaard 71c761
+	pselect_alarm.stdout.exp pselect_alarm.stderr.exp pselect_alarm.vgtest \
Mark Wielaard 71c761
 	pth_atfork1.stderr.exp pth_atfork1.stdout.exp pth_atfork1.vgtest \
Mark Wielaard 71c761
 	pth_blockedsig.stderr.exp \
Mark Wielaard 71c761
 	pth_blockedsig.stdout.exp pth_blockedsig.vgtest \
Mark Wielaard 71c761
@@ -1152,6 +1161,8 @@
Mark Wielaard 71c761
 	../../VEX/libvex-@VGCONF_ARCH_PRI@-@VGCONF_OS@.a @LIB_UBSAN@
Mark Wielaard 71c761
 
Mark Wielaard 71c761
 libvexmultiarch_test_SOURCES = libvex_test.c
Mark Wielaard 71c761
+ppoll_alarm_LDADD = -lpthread
Mark Wielaard 71c761
+pselect_alarm_LDADD = -lpthread
Mark Wielaard 71c761
 pth_atfork1_LDADD = -lpthread
Mark Wielaard 71c761
 pth_blockedsig_LDADD = -lpthread
Mark Wielaard 71c761
 pth_cancel1_CFLAGS = $(AM_CFLAGS) -Wno-shadow
Mark Wielaard 71c761
@@ -1390,6 +1401,10 @@
Mark Wielaard 71c761
 	@rm -f pending$(EXEEXT)
Mark Wielaard 71c761
 	$(AM_V_CCLD)$(LINK) $(pending_OBJECTS) $(pending_LDADD) $(LIBS)
Mark Wielaard 71c761
 
Mark Wielaard 71c761
+ppoll_alarm$(EXEEXT): $(ppoll_alarm_OBJECTS) $(ppoll_alarm_DEPENDENCIES) $(EXTRA_ppoll_alarm_DEPENDENCIES) 
Mark Wielaard 71c761
+	@rm -f ppoll_alarm$(EXEEXT)
Mark Wielaard 71c761
+	$(AM_V_CCLD)$(LINK) $(ppoll_alarm_OBJECTS) $(ppoll_alarm_LDADD) $(LIBS)
Mark Wielaard 71c761
+
Mark Wielaard 71c761
 process_vm_readv_writev$(EXEEXT): $(process_vm_readv_writev_OBJECTS) $(process_vm_readv_writev_DEPENDENCIES) $(EXTRA_process_vm_readv_writev_DEPENDENCIES) 
Mark Wielaard 71c761
 	@rm -f process_vm_readv_writev$(EXEEXT)
Mark Wielaard 71c761
 	$(AM_V_CCLD)$(LINK) $(process_vm_readv_writev_OBJECTS) $(process_vm_readv_writev_LDADD) $(LIBS)
Mark Wielaard 71c761
@@ -1398,6 +1413,10 @@
Mark Wielaard 71c761
 	@rm -f procfs-cmdline-exe$(EXEEXT)
Mark Wielaard 71c761
 	$(AM_V_CCLD)$(LINK) $(procfs_cmdline_exe_OBJECTS) $(procfs_cmdline_exe_LDADD) $(LIBS)
Mark Wielaard 71c761
 
Mark Wielaard 71c761
+pselect_alarm$(EXEEXT): $(pselect_alarm_OBJECTS) $(pselect_alarm_DEPENDENCIES) $(EXTRA_pselect_alarm_DEPENDENCIES) 
Mark Wielaard 71c761
+	@rm -f pselect_alarm$(EXEEXT)
Mark Wielaard 71c761
+	$(AM_V_CCLD)$(LINK) $(pselect_alarm_OBJECTS) $(pselect_alarm_LDADD) $(LIBS)
Mark Wielaard 71c761
+
Mark Wielaard 71c761
 pth_atfork1$(EXEEXT): $(pth_atfork1_OBJECTS) $(pth_atfork1_DEPENDENCIES) $(EXTRA_pth_atfork1_DEPENDENCIES) 
Mark Wielaard 71c761
 	@rm -f pth_atfork1$(EXEEXT)
Mark Wielaard 71c761
 	$(AM_V_CCLD)$(LINK) $(pth_atfork1_OBJECTS) $(pth_atfork1_LDADD) $(LIBS)
Mark Wielaard 71c761
@@ -1607,8 +1626,10 @@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/munmap_exe.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nestedfns-nestedfns.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pending.Po@am__quote@
Mark Wielaard 71c761
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ppoll_alarm.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process_vm_readv_writev.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/procfs-cmdline-exe.Po@am__quote@
Mark Wielaard 71c761
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pselect_alarm.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pth_atfork1.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pth_blockedsig.Po@am__quote@
Mark Wielaard 71c761
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pth_cancel1-pth_cancel1.Po@am__quote@