From 00057df2c421d7028a70e6bcd9af3bf00c6f8344 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 14 Jul 2009 00:06:00 +0000 Subject: [PATCH] Some ioctls don't look at ARG3 at all. Based on patches from Clemens Ladisch. Fixes bug 159501. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10441 --- coregrind/m_syswrap/syswrap-linux.c | 51 +++++++++++++++++++++-------- include/vki/vki-linux.h | 2 ++ 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index 95566af0e8..a4a291cb28 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -3323,6 +3323,40 @@ PRE(sys_ioctl) PRE_REG_READ3(long, "ioctl", unsigned int, fd, unsigned int, request, unsigned long, arg); + // We first handle the ones that don't use ARG3 (even as a + // scalar/non-pointer argument). + switch (ARG2 /* request */) { + + /* linux/soundcard interface (ALSA) */ + case VKI_SNDRV_PCM_IOCTL_HW_FREE: + case VKI_SNDRV_PCM_IOCTL_HWSYNC: + case VKI_SNDRV_PCM_IOCTL_PREPARE: + case VKI_SNDRV_PCM_IOCTL_RESET: + case VKI_SNDRV_PCM_IOCTL_START: + case VKI_SNDRV_PCM_IOCTL_DROP: + case VKI_SNDRV_PCM_IOCTL_DRAIN: + case VKI_SNDRV_PCM_IOCTL_RESUME: + case VKI_SNDRV_PCM_IOCTL_XRUN: + case VKI_SNDRV_PCM_IOCTL_UNLINK: + case VKI_SNDRV_TIMER_IOCTL_START: + case VKI_SNDRV_TIMER_IOCTL_STOP: + case VKI_SNDRV_TIMER_IOCTL_CONTINUE: + case VKI_SNDRV_TIMER_IOCTL_PAUSE: + PRINT("sys_ioctl ( %d, 0x%x )",ARG1,ARG2); + PRE_REG_READ2(long, "ioctl", + unsigned int, fd, unsigned int, request); + return; + + default: + PRINT("sys_ioctl ( %d, 0x%x, %p )",ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "ioctl", + unsigned int, fd, unsigned int, request, unsigned long, arg); + break; + } + + // We now handle those that do look at ARG3 (and unknown ones fall into + // this category). Nb: some of these may well belong in the + // doesn't-use-ARG3 switch above. switch (ARG2 /* request */) { case VKI_TCSETS: case VKI_TCSETSW: @@ -3718,20 +3752,9 @@ PRE(sys_ioctl) break; /* linux/soundcard interface (ALSA) */ - case VKI_SNDRV_PCM_IOCTL_HW_FREE: - case VKI_SNDRV_PCM_IOCTL_HWSYNC: - case VKI_SNDRV_PCM_IOCTL_PREPARE: - case VKI_SNDRV_PCM_IOCTL_RESET: - case VKI_SNDRV_PCM_IOCTL_START: - case VKI_SNDRV_PCM_IOCTL_DROP: - case VKI_SNDRV_PCM_IOCTL_DRAIN: - case VKI_SNDRV_PCM_IOCTL_RESUME: - case VKI_SNDRV_PCM_IOCTL_XRUN: - case VKI_SNDRV_PCM_IOCTL_UNLINK: - case VKI_SNDRV_TIMER_IOCTL_START: - case VKI_SNDRV_TIMER_IOCTL_STOP: - case VKI_SNDRV_TIMER_IOCTL_CONTINUE: - case VKI_SNDRV_TIMER_IOCTL_PAUSE: + case VKI_SNDRV_PCM_IOCTL_PAUSE: + case VKI_SNDRV_PCM_IOCTL_LINK: + /* these just take an int by value */ break; /* Real Time Clock (/dev/rtc) ioctls */ diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 07fe899d5b..d31bd8be20 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -2134,8 +2134,10 @@ enum { VKI_SNDRV_PCM_IOCTL_START = _VKI_IO('A', 0x42), VKI_SNDRV_PCM_IOCTL_DROP = _VKI_IO('A', 0x43), VKI_SNDRV_PCM_IOCTL_DRAIN = _VKI_IO('A', 0x44), + VKI_SNDRV_PCM_IOCTL_PAUSE = _VKI_IOW('A', 0x45, int), VKI_SNDRV_PCM_IOCTL_RESUME = _VKI_IO('A', 0x47), VKI_SNDRV_PCM_IOCTL_XRUN = _VKI_IO('A', 0x48), + VKI_SNDRV_PCM_IOCTL_LINK = _VKI_IOW('A', 0x60, int), VKI_SNDRV_PCM_IOCTL_UNLINK = _VKI_IO('A', 0x61), }; -- 2.47.3