Discussion:
[Valgrind-developers] Valgrind: r16451 - in /trunk: NEWS coregrind/m_syswrap/syswrap-linux.c memcheck/tests/linux/syscalls-2007.c
s***@valgrind.org
2017-06-17 13:49:23 UTC
Permalink
Author: mjw
Date: Sat Jun 17 14:49:22 2017
New Revision: 16451

Log:
epoll_pwait can have a NULL sigmask.

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 (ARG4 is timeout and ARG5 is sigmask).

This shows up with newer glibc which translates an epoll_wait call into
an epoll_pwait call with NULL sigmask.

Fix typo and add a testcase.

https://bugs.kde.org/show_bug.cgi?id=381289

Modified:
trunk/NEWS
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/memcheck/tests/linux/syscalls-2007.c

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Sat Jun 17 14:49:22 2017
@@ -38,6 +38,7 @@
380397 s390x: __GI_strcspn() replacemenet needed
381162 possible array overrun in VEX register allocator
381272 ppc64 doesn't compile test_isa_2_06_partx.c without VSX support
+381289 epoll_pwait can have a NULL sigmask


Release 3.13.0 (15 June 2017)

Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c Sat Jun 17 14:49:22 2017
@@ -1901,7 +1901,7 @@
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)

Modified: trunk/memcheck/tests/linux/syscalls-2007.c
==============================================================================
--- trunk/memcheck/tests/linux/syscalls-2007.c (original)
+++ trunk/memcheck/tests/linux/syscalls-2007.c Sat Jun 17 14:49:22 2017
@@ -79,5 +79,16 @@
}
#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;
}

Loading...