[PATCH] ASoC: amd: acp: Fix possible UAF in acp_dma_open

Gaosheng Cui cuigaosheng1 at huawei.com
Thu Nov 17 07:12:48 CET 2022


Smatch report warning as follows:

sound/soc/amd/acp/acp-platform.c:199 acp_dma_open() warn:
  '&stream->list' not removed from list

If snd_pcm_hw_constraint_integer() fails in acp_dma_open(),
stream will be freed, but stream->list will not be removed from
adata->stream_list, then list traversal may cause UAF.

Fix by removeing it from adata->stream_list before free().

Fixes: 7929985cfe36 ("ASoC: amd: acp: Initialize list to store acp_stream during pcm_open")
Signed-off-by: Gaosheng Cui <cuigaosheng1 at huawei.com>
---
 sound/soc/amd/acp/acp-platform.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sound/soc/amd/acp/acp-platform.c b/sound/soc/amd/acp/acp-platform.c
index 85a81add4ef9..275e0428eec4 100644
--- a/sound/soc/amd/acp/acp-platform.c
+++ b/sound/soc/amd/acp/acp-platform.c
@@ -196,6 +196,9 @@ static int acp_dma_open(struct snd_soc_component *component, struct snd_pcm_subs
 	ret = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
 	if (ret < 0) {
 		dev_err(component->dev, "set integer constraint failed\n");
+		spin_lock_irq(&adata->acp_lock);
+		list_del(&stream->list);
+		spin_unlock_irq(&adata->acp_lock);
 		kfree(stream);
 		return ret;
 	}
-- 
2.25.1



More information about the Alsa-devel mailing list