summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2019-12-11 16:57:42 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-12-31 16:34:45 +0100
commitb05779d011efb4021aff61f3aa9ef908e26fa8ea (patch)
tree84fe423ff12fd6c47220809271cba0c0ff5feb2e
parentb3484913573e1de1ea946960da88e8243b20de58 (diff)
downloadlinux-stable-b05779d011efb4021aff61f3aa9ef908e26fa8ea.tar.gz
linux-stable-b05779d011efb4021aff61f3aa9ef908e26fa8ea.tar.bz2
linux-stable-b05779d011efb4021aff61f3aa9ef908e26fa8ea.zip
ALSA: pcm: Avoid possible info leaks from PCM stream buffers
commit add9d56d7b3781532208afbff5509d7382fb6efe upstream. The current PCM code doesn't initialize explicitly the buffers allocated for PCM streams, hence it might leak some uninitialized kernel data or previous stream contents by mmapping or reading the buffer before actually starting the stream. Since this is a common problem, this patch simply adds the clearance of the buffer data at hw_params callback. Although this does only zero-clear no matter which format is used, which doesn't mean the silence for some formats, but it should be OK because the intention is just to clear the previous data on the buffer. Reported-by: Lionel Koenig <lionel.koenig@gmail.com> Cc: <stable@vger.kernel.org> Link: https://lore.kernel.org/r/20191211155742.3213-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--sound/core/pcm_native.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index e08c6c6ca029..f03ceaff75b5 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -752,6 +752,10 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
while (runtime->boundary * 2 <= LONG_MAX - runtime->buffer_size)
runtime->boundary *= 2;
+ /* clear the buffer for avoiding possible kernel info leaks */
+ if (runtime->dma_area && !substream->ops->copy_user)
+ memset(runtime->dma_area, 0, runtime->dma_bytes);
+
snd_pcm_timer_resolution_change(substream);
snd_pcm_set_state(substream, SNDRV_PCM_STATE_SETUP);