Commit 65766ee0 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: oss: Use kvzalloc() for local buffer allocations

PCM OSS layer may allocate a few temporary buffers, one for the core
read/write and another for the conversions via plugins.  Currently
both are allocated via vmalloc().  But as the allocation size is
equivalent with the PCM period size, the required size might be quite
small, depending on the application.

This patch replaces these vmalloc() calls with kvzalloc() for covering
small period sizes better.  Also, we use "z"-alloc variant here for
addressing the possible uninitialized access reported by syzkaller.

Reported-by: syzbot+1cb36954e127c98dd037@syzkaller.appspotmail.com
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 5e93a125
...@@ -1062,8 +1062,8 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream) ...@@ -1062,8 +1062,8 @@ static int snd_pcm_oss_change_params_locked(struct snd_pcm_substream *substream)
runtime->oss.channels = params_channels(params); runtime->oss.channels = params_channels(params);
runtime->oss.rate = params_rate(params); runtime->oss.rate = params_rate(params);
vfree(runtime->oss.buffer); kvfree(runtime->oss.buffer);
runtime->oss.buffer = vmalloc(runtime->oss.period_bytes); runtime->oss.buffer = kvzalloc(runtime->oss.period_bytes, GFP_KERNEL);
if (!runtime->oss.buffer) { if (!runtime->oss.buffer) {
err = -ENOMEM; err = -ENOMEM;
goto failure; goto failure;
...@@ -2328,7 +2328,7 @@ static void snd_pcm_oss_release_substream(struct snd_pcm_substream *substream) ...@@ -2328,7 +2328,7 @@ static void snd_pcm_oss_release_substream(struct snd_pcm_substream *substream)
{ {
struct snd_pcm_runtime *runtime; struct snd_pcm_runtime *runtime;
runtime = substream->runtime; runtime = substream->runtime;
vfree(runtime->oss.buffer); kvfree(runtime->oss.buffer);
runtime->oss.buffer = NULL; runtime->oss.buffer = NULL;
#ifdef CONFIG_SND_PCM_OSS_PLUGINS #ifdef CONFIG_SND_PCM_OSS_PLUGINS
snd_pcm_oss_plugin_clear(substream); snd_pcm_oss_plugin_clear(substream);
......
...@@ -66,8 +66,8 @@ static int snd_pcm_plugin_alloc(struct snd_pcm_plugin *plugin, snd_pcm_uframes_t ...@@ -66,8 +66,8 @@ static int snd_pcm_plugin_alloc(struct snd_pcm_plugin *plugin, snd_pcm_uframes_t
return -ENXIO; return -ENXIO;
size /= 8; size /= 8;
if (plugin->buf_frames < frames) { if (plugin->buf_frames < frames) {
vfree(plugin->buf); kvfree(plugin->buf);
plugin->buf = vmalloc(size); plugin->buf = kvzalloc(size, GFP_KERNEL);
plugin->buf_frames = frames; plugin->buf_frames = frames;
} }
if (!plugin->buf) { if (!plugin->buf) {
...@@ -191,7 +191,7 @@ int snd_pcm_plugin_free(struct snd_pcm_plugin *plugin) ...@@ -191,7 +191,7 @@ int snd_pcm_plugin_free(struct snd_pcm_plugin *plugin)
if (plugin->private_free) if (plugin->private_free)
plugin->private_free(plugin); plugin->private_free(plugin);
kfree(plugin->buf_channels); kfree(plugin->buf_channels);
vfree(plugin->buf); kvfree(plugin->buf);
kfree(plugin); kfree(plugin);
return 0; return 0;
} }
......
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