Add support for ioctl(fd, TIOCSIG, signal_number) which used
to issue a false complaint. Fixes BZ #339706
Source patch by David Herrmann (dh.herrmann@gmail.com).
Testcase by myself.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14646 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/NEWS b/NEWS
index c99ed30..f1d76c9 100644
--- a/NEWS
+++ b/NEWS
@@ -42,6 +42,7 @@
339688 Mac-specific ASM does not support .version directive (cpuid,
tronical and pushfpopf tests)
+339706 Fix false positive for ioctl(TIOCSIG) on linux
339721 assertion 'check_sibling == sibling' failed in readdwarf3.c ...
339789 Fix none/tests/execve test on Mac OS X 10.9
339808 Fix none/tests/rlimit64_nofile test on Mac OS X 10.9
diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c
index 9253947..99091a0 100644
--- a/coregrind/m_syswrap/syswrap-linux.c
+++ b/coregrind/m_syswrap/syswrap-linux.c
@@ -5481,6 +5481,7 @@
case VKI_TCXONC:
case VKI_TCSBRKP:
case VKI_TCFLSH:
+ case VKI_TIOCSIG:
/* These just take an int by value */
break;
case VKI_TIOCGWINSZ:
@@ -8270,6 +8271,7 @@
case VKI_TCXONC:
case VKI_TCSBRKP:
case VKI_TCFLSH:
+ case VKI_TIOCSIG:
break;
case VKI_TIOCGWINSZ:
POST_MEM_WRITE( ARG3, sizeof(struct vki_winsize) );
diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h
index 2d81e3f..9dadf58 100644
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -2955,6 +2955,10 @@
#define VKI_FIOQSIZE 0x5460 /* Value differs on some platforms */
#endif
+#ifndef VKI_TIOCSIG
+#define VKI_TIOCSIG _VKI_IOW('T', 0x36, int) /* Value differs on some platforms */
+#endif
+
//----------------------------------------------------------------------
// From kernel/common/include/linux/ashmem.h
//----------------------------------------------------------------------
diff --git a/memcheck/tests/linux/Makefile.am b/memcheck/tests/linux/Makefile.am
index 9755f5c..d8a7d4d 100644
--- a/memcheck/tests/linux/Makefile.am
+++ b/memcheck/tests/linux/Makefile.am
@@ -6,6 +6,7 @@
EXTRA_DIST = \
brk.stderr.exp brk.vgtest \
capget.vgtest capget.stderr.exp capget.stderr.exp2 \
+ ioctl-tiocsig.vgtest ioctl-tiocsig.stderr.exp \
lsframe1.vgtest lsframe1.stdout.exp lsframe1.stderr.exp \
lsframe2.vgtest lsframe2.stdout.exp lsframe2.stderr.exp \
rfcomm.vgtest rfcomm.stderr.exp \
@@ -24,6 +25,7 @@
check_PROGRAMS = \
brk \
capget \
+ ioctl-tiocsig \
getregset \
lsframe1 \
lsframe2 \
diff --git a/memcheck/tests/linux/ioctl-tiocsig.c b/memcheck/tests/linux/ioctl-tiocsig.c
new file mode 100644
index 0000000..1738066
--- /dev/null
+++ b/memcheck/tests/linux/ioctl-tiocsig.c
@@ -0,0 +1,7 @@
+#include <sys/ioctl.h>
+
+int main()
+{
+ ioctl(9, TIOCSIG, 9);
+ return 0;
+}
diff --git a/memcheck/tests/linux/ioctl-tiocsig.stderr.exp b/memcheck/tests/linux/ioctl-tiocsig.stderr.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/memcheck/tests/linux/ioctl-tiocsig.stderr.exp
diff --git a/memcheck/tests/linux/ioctl-tiocsig.vgtest b/memcheck/tests/linux/ioctl-tiocsig.vgtest
new file mode 100644
index 0000000..2e75ad5
--- /dev/null
+++ b/memcheck/tests/linux/ioctl-tiocsig.vgtest
@@ -0,0 +1,2 @@
+prog: ioctl-tiocsig
+vgopts: -q