Bug 381289 - epoll_pwait can have a NULL sigmask
Summary: epoll_pwait can have a NULL sigmask
Status: RESOLVED FIXED
Alias: None
Product: valgrind
Classification: Developer tools
Component: general (show other bugs)
Version: 3.13 SVN
Platform: Other Linux
: NOR normal
Target Milestone: ---
Assignee: Julian Seward
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-06-16 15:44 UTC by Mark Wielaard
Modified: 2017-06-17 13:49 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mark Wielaard 2017-06-16 15:44:30 UTC
Originally reported against Fedora:
https://bugzilla.redhat.com/show_bug.cgi?id=1462258

According to the epoll_pwait(2) man page:

       The  sigmask  argument  may  be  specified  as  NULL,  in  which  case
       epoll_pwait() is equivalent to epoll_wait().

But doing that under valgrind gives:

==13887== Syscall param epoll_pwait(sigmask) points to unaddressable byte(s)
==13887==    at 0x4F2B940: epoll_pwait (epoll_pwait.c:43)
==13887==    by 0x400ADE: main (syscalls-2007.c:89)
==13887==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

This is because the sys_epoll_pwait wrapper has:

   if (ARG4)
      PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) );

Which looks like a typo (ARGS4 is timeout and ARG5 is sigmask).

Proposed patch and testcase update:

diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
index 26e02fd..4120c1d 100644
--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -1901,7 +1901,7 @@ PRE(sys_epoll_pwait)
                  int, maxevents, int, timeout, vki_sigset_t *, sigmask,
                  vki_size_t, sigsetsize);
    PRE_MEM_WRITE( "epoll_pwait(events)", ARG2, sizeof(struct vki_epoll_event)*ARG3);
-   if (ARG4)
+   if (ARG5)
       PRE_MEM_READ( "epoll_pwait(sigmask)", ARG5, sizeof(vki_sigset_t) );
 }
 POST(sys_epoll_pwait)
diff --git a/memcheck/tests/linux/syscalls-2007.c b/memcheck/tests/linux/syscalls-2007.c
index b61c6d5..5494623 100644
--- a/memcheck/tests/linux/syscalls-2007.c
+++ b/memcheck/tests/linux/syscalls-2007.c
@@ -79,5 +79,16 @@ int main (void)
   }
 #endif
 
+#if defined(HAVE_EPOLL_CREATE) && defined(HAVE_EPOLL_PWAIT)
+  {
+    int fd3;
+    struct epoll_event evs[10];
+
+    fd3 = epoll_create (10);
+    /* epoll_pwait can take a NULL sigmask. */
+    epoll_pwait (fd3, evs, 10, 1, NULL);
+  }
+#endif
+
   return 0;
 }
Comment 1 Mark Wielaard 2017-06-17 13:49:44 UTC
valgrind svn r16451