|
From: <sv...@va...> - 2009-07-14 00:06:09
|
Author: njn
Date: 2009-07-14 01:06:00 +0100 (Tue, 14 Jul 2009)
New Revision: 10441
Log:
Some ioctls don't look at ARG3 at all. Based on patches from Clemens
Ladisch. Fixes bug 159501.
Modified:
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/include/vki/vki-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c 2009-07-13 22:20:00 UTC (rev 10440)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c 2009-07-14 00:06:00 UTC (rev 10441)
@@ -3323,7 +3323,41 @@
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:
case VKI_TCSETSF:
@@ -3718,20 +3752,9 @@
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 */
Modified: trunk/include/vki/vki-linux.h
===================================================================
--- trunk/include/vki/vki-linux.h 2009-07-13 22:20:00 UTC (rev 10440)
+++ trunk/include/vki/vki-linux.h 2009-07-14 00:06:00 UTC (rev 10441)
@@ -2134,8 +2134,10 @@
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),
};
|