Commit 175b8d89 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: pcm: oss: Fix potential out-of-bounds shift

syzbot spotted a potential out-of-bounds shift in the PCM OSS layer
where it calculates the buffer size with the arbitrary shift value
given via an ioctl.

Add a range check for avoiding the undefined behavior.
As the value can be treated by a signed integer, the max shift should
be 30.

Reported-by: syzbot+df7dc146ebdd6435eea3@syzkaller.appspotmail.com
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20201209084552.17109-2-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 43d5ca88
...@@ -1935,11 +1935,15 @@ static int snd_pcm_oss_set_subdivide(struct snd_pcm_oss_file *pcm_oss_file, int ...@@ -1935,11 +1935,15 @@ static int snd_pcm_oss_set_subdivide(struct snd_pcm_oss_file *pcm_oss_file, int
static int snd_pcm_oss_set_fragment1(struct snd_pcm_substream *substream, unsigned int val) static int snd_pcm_oss_set_fragment1(struct snd_pcm_substream *substream, unsigned int val)
{ {
struct snd_pcm_runtime *runtime; struct snd_pcm_runtime *runtime;
int fragshift;
runtime = substream->runtime; runtime = substream->runtime;
if (runtime->oss.subdivision || runtime->oss.fragshift) if (runtime->oss.subdivision || runtime->oss.fragshift)
return -EINVAL; return -EINVAL;
runtime->oss.fragshift = val & 0xffff; fragshift = val & 0xffff;
if (fragshift >= 31)
return -EINVAL;
runtime->oss.fragshift = fragshift;
runtime->oss.maxfrags = (val >> 16) & 0xffff; runtime->oss.maxfrags = (val >> 16) & 0xffff;
if (runtime->oss.fragshift < 4) /* < 16 */ if (runtime->oss.fragshift < 4) /* < 16 */
runtime->oss.fragshift = 4; runtime->oss.fragshift = 4;
......
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