|
From: <sv...@va...> - 2016-06-21 19:58:29
|
Author: mjw
Date: Tue Jun 21 20:58:21 2016
New Revision: 15893
Log:
Bug 364413 pselect sycallwrapper mishandles NULL sigmask.
Don't check or try to copy sigmask if it is NULL. The sigmask might be
given in a struct, where the length is non-zero, but the signal set
pointer is NULL.
Testcase provided by Paul Eggert <eg...@cs...>.
Added:
trunk/none/tests/pselect_sigmask_null.c
trunk/none/tests/pselect_sigmask_null.stderr.exp
trunk/none/tests/pselect_sigmask_null.stdout.exp
trunk/none/tests/pselect_sigmask_null.vgtest
Modified:
trunk/NEWS
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/none/tests/Makefile.am
Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS (original)
+++ trunk/NEWS Tue Jun 21 20:58:21 2016
@@ -107,6 +107,7 @@
363680 add renameat2() support
363705 arm64 missing syscall name_to_handle_at and open_by_handle_at
363714 ppc64 missing syscalls sync, waitid and name_to/open_by_handle_at
+364413 pselect sycallwrapper mishandles NULL sigmask
n-i-bz Fix incorrect (or infinite loop) unwind on RHEL7 x86 and amd64
n-i-bz massif --pages-as-heap=yes does not report peak caused by mmap+munmap
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
==============================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c (original)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c Tue Jun 21 20:58:21 2016
@@ -1316,11 +1316,15 @@
pas->ss.ss = (void *)1;
pas->ss.ss_len = pss->ss_len;
if (pss->ss_len == sizeof(*pss->ss)) {
- PRE_MEM_READ("pselect6(sig->ss)", (Addr)pss->ss, pss->ss_len);
- if (ML_(safe_to_deref)(pss->ss, sizeof(*pss->ss))) {
- pas->adjusted_ss = *pss->ss;
- pas->ss.ss = &pas->adjusted_ss;
- VG_(sanitize_client_sigmask)(&pas->adjusted_ss);
+ if (pss->ss == NULL) {
+ pas->ss.ss = NULL;
+ } else {
+ PRE_MEM_READ("pselect6(sig->ss)", (Addr)pss->ss, pss->ss_len);
+ if (ML_(safe_to_deref)(pss->ss, sizeof(*pss->ss))) {
+ pas->adjusted_ss = *pss->ss;
+ pas->ss.ss = &pas->adjusted_ss;
+ VG_(sanitize_client_sigmask)(&pas->adjusted_ss);
+ }
}
}
}
Modified: trunk/none/tests/Makefile.am
==============================================================================
--- trunk/none/tests/Makefile.am (original)
+++ trunk/none/tests/Makefile.am Tue Jun 21 20:58:21 2016
@@ -150,6 +150,8 @@
procfs-non-linux.stderr.exp-with-readlinkat \
procfs-non-linux.stderr.exp-without-readlinkat \
pselect_alarm.stdout.exp pselect_alarm.stderr.exp pselect_alarm.vgtest \
+ pselect_signask_null.vgtest \
+ pselect_sigmask_null.stdout.exp pselect_sigmask_null.stderr.exp \
pth_atfork1.stderr.exp pth_atfork1.stdout.exp pth_atfork1.vgtest \
pth_blockedsig.stderr.exp \
pth_blockedsig.stdout.exp pth_blockedsig.vgtest \
@@ -219,6 +221,7 @@
pending \
procfs-cmdline-exe \
pselect_alarm \
+ pselect_sigmask_null \
pth_atfork1 pth_blockedsig pth_cancel1 pth_cancel2 pth_cvsimple \
pth_empty pth_exit pth_exit2 pth_mutexspeed pth_once pth_rwlock \
pth_stackalign \
Added: trunk/none/tests/pselect_sigmask_null.c
==============================================================================
--- trunk/none/tests/pselect_sigmask_null.c (added)
+++ trunk/none/tests/pselect_sigmask_null.c Tue Jun 21 20:58:21 2016
@@ -0,0 +1,26 @@
+/* Make sure handling of NULL sigmask is correct.
+ https://bugs.kde.org/show_bug.cgi?id=XXX
+ We might try to make a copy and adjust the mask.
+ Testcase provided by Paul Eggert <eg...@cs...> */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/select.h>
+
+int
+main (void)
+{
+ struct timespec timeout;
+ timeout.tv_sec = 1;
+ timeout.tv_nsec = 0;
+ switch (pselect (0, 0, 0, 0, &timeout, 0))
+ {
+ default:
+ abort ();
+ case -1:
+ perror ("pselect");
+ return 1;
+ case 0:
+ return 0;
+ }
+}
Added: trunk/none/tests/pselect_sigmask_null.stderr.exp
==============================================================================
(empty)
Added: trunk/none/tests/pselect_sigmask_null.stdout.exp
==============================================================================
(empty)
Added: trunk/none/tests/pselect_sigmask_null.vgtest
==============================================================================
--- trunk/none/tests/pselect_sigmask_null.vgtest (added)
+++ trunk/none/tests/pselect_sigmask_null.vgtest Tue Jun 21 20:58:21 2016
@@ -0,0 +1,2 @@
+prog: pselect_sigmask_null
+vgopts: -q
|