Commit 83266b6b authored by Takashi Iwai's avatar Takashi Iwai

ALSA: Fix compat_ioctl handling for OSS emulations

The ALSA PCM, mixer and sequencer OSS emulations provide the 32bit
compatible ioctl, but they just call the 64bit native ioctl as is.
Although this works in most cases, passing the argument value as-is
isn't guaranteed to work on all architectures.  We need to convert it
via compat_ptr() instead.

This patch addresses the missing conversions.  Since all relevant
ioctls in these functions take the argument as a pointer, we do the
pointer conversion in each compat_ioctl and pass it as a 64bit value
to the native ioctl.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent eb399d3c
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/time.h> #include <linux/time.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/compat.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/minors.h> #include <sound/minors.h>
#include <sound/control.h> #include <sound/control.h>
...@@ -397,7 +398,12 @@ int snd_mixer_oss_ioctl_card(struct snd_card *card, unsigned int cmd, unsigned l ...@@ -397,7 +398,12 @@ int snd_mixer_oss_ioctl_card(struct snd_card *card, unsigned int cmd, unsigned l
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
/* all compatible */ /* all compatible */
#define snd_mixer_oss_ioctl_compat snd_mixer_oss_ioctl static long snd_mixer_oss_ioctl_compat(struct file *file, unsigned int cmd,
unsigned long arg)
{
return snd_mixer_oss_ioctl1(file->private_data, cmd,
(unsigned long)compat_ptr(arg));
}
#else #else
#define snd_mixer_oss_ioctl_compat NULL #define snd_mixer_oss_ioctl_compat NULL
#endif #endif
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/math64.h> #include <linux/math64.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/compat.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/minors.h> #include <sound/minors.h>
#include <sound/pcm.h> #include <sound/pcm.h>
...@@ -2648,7 +2649,11 @@ static long snd_pcm_oss_ioctl(struct file *file, unsigned int cmd, unsigned long ...@@ -2648,7 +2649,11 @@ static long snd_pcm_oss_ioctl(struct file *file, unsigned int cmd, unsigned long
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
/* all compatible */ /* all compatible */
#define snd_pcm_oss_ioctl_compat snd_pcm_oss_ioctl static long snd_pcm_oss_ioctl_compat(struct file *file, unsigned int cmd,
unsigned long arg)
{
return snd_pcm_oss_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
}
#else #else
#define snd_pcm_oss_ioctl_compat NULL #define snd_pcm_oss_ioctl_compat NULL
#endif #endif
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/compat.h>
#include <sound/core.h> #include <sound/core.h>
#include <sound/minors.h> #include <sound/minors.h>
#include <sound/initval.h> #include <sound/initval.h>
...@@ -189,7 +190,11 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ...@@ -189,7 +190,11 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
} }
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
#define odev_ioctl_compat odev_ioctl static long odev_ioctl_compat(struct file *file, unsigned int cmd,
unsigned long arg)
{
return odev_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
}
#else #else
#define odev_ioctl_compat NULL #define odev_ioctl_compat NULL
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment