Commit 009a7479 authored by Jaroslav Kysela's avatar Jaroslav Kysela

[ALSA] Fix 32bit calls to snd_pcm_channel_info()

PCM Midlevel
Fix 32-bit calls to snd_pcm_channel_info().
Signed-off-by: default avatarBrian Gerst <bgerst@didntduck.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent a9466dfd
...@@ -602,17 +602,13 @@ static int snd_pcm_status_user(snd_pcm_substream_t * substream, snd_pcm_status_t ...@@ -602,17 +602,13 @@ static int snd_pcm_status_user(snd_pcm_substream_t * substream, snd_pcm_status_t
return 0; return 0;
} }
static int snd_pcm_channel_info(snd_pcm_substream_t * substream, snd_pcm_channel_info_t __user * _info) static int snd_pcm_channel_info(snd_pcm_substream_t * substream, snd_pcm_channel_info_t * info)
{ {
snd_pcm_channel_info_t info;
snd_pcm_runtime_t *runtime; snd_pcm_runtime_t *runtime;
int res;
unsigned int channel; unsigned int channel;
snd_assert(substream != NULL, return -ENXIO); snd_assert(substream != NULL, return -ENXIO);
if (copy_from_user(&info, _info, sizeof(info))) channel = info->channel;
return -EFAULT;
channel = info.channel;
runtime = substream->runtime; runtime = substream->runtime;
snd_pcm_stream_lock_irq(substream); snd_pcm_stream_lock_irq(substream);
if (runtime->status->state == SNDRV_PCM_STATE_OPEN) { if (runtime->status->state == SNDRV_PCM_STATE_OPEN) {
...@@ -622,9 +618,19 @@ static int snd_pcm_channel_info(snd_pcm_substream_t * substream, snd_pcm_channel ...@@ -622,9 +618,19 @@ static int snd_pcm_channel_info(snd_pcm_substream_t * substream, snd_pcm_channel
snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream);
if (channel >= runtime->channels) if (channel >= runtime->channels)
return -EINVAL; return -EINVAL;
memset(&info, 0, sizeof(info)); memset(info, 0, sizeof(*info));
info.channel = channel; info->channel = channel;
res = substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_CHANNEL_INFO, &info); return substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_CHANNEL_INFO, info);
}
static int snd_pcm_channel_info_user(snd_pcm_substream_t * substream, snd_pcm_channel_info_t __user * _info)
{
snd_pcm_channel_info_t info;
int res;
if (copy_from_user(&info, _info, sizeof(info)))
return -EFAULT;
res = snd_pcm_channel_info(substream, &info);
if (res < 0) if (res < 0)
return res; return res;
if (copy_to_user(_info, &info, sizeof(info))) if (copy_to_user(_info, &info, sizeof(info)))
...@@ -2440,7 +2446,7 @@ static int snd_pcm_common_ioctl1(snd_pcm_substream_t *substream, ...@@ -2440,7 +2446,7 @@ static int snd_pcm_common_ioctl1(snd_pcm_substream_t *substream,
case SNDRV_PCM_IOCTL_STATUS: case SNDRV_PCM_IOCTL_STATUS:
return snd_pcm_status_user(substream, arg); return snd_pcm_status_user(substream, arg);
case SNDRV_PCM_IOCTL_CHANNEL_INFO: case SNDRV_PCM_IOCTL_CHANNEL_INFO:
return snd_pcm_channel_info(substream, arg); return snd_pcm_channel_info_user(substream, arg);
case SNDRV_PCM_IOCTL_PREPARE: case SNDRV_PCM_IOCTL_PREPARE:
return snd_pcm_prepare(substream); return snd_pcm_prepare(substream);
case SNDRV_PCM_IOCTL_RESET: case SNDRV_PCM_IOCTL_RESET:
......
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