mirror of
https://github.com/torvalds/linux.git
synced 2024-10-26 06:54:41 +00:00
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.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
43d5ca88df
commit
175b8d89fe
|
@ -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)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime;
|
||||
int fragshift;
|
||||
|
||||
runtime = substream->runtime;
|
||||
if (runtime->oss.subdivision || runtime->oss.fragshift)
|
||||
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;
|
||||
if (runtime->oss.fragshift < 4) /* < 16 */
|
||||
runtime->oss.fragshift = 4;
|
||||
|
|
Loading…
Reference in New Issue
Block a user