Commit 86a24e99 authored by Nikita Zhandarovich's avatar Nikita Zhandarovich Committed by Mark Brown

ASoC: fsl_asrc_dma: fix potential null-ptr-deref

dma_request_slave_channel() may return NULL which will lead to
NULL pointer dereference error in 'tmp_chan->private'.

Correct this behaviour by, first, switching from deprecated function
dma_request_slave_channel() to dma_request_chan(). Secondly, enable
sanity check for the resuling value of dma_request_chan().
Also, fix description that follows the enacted changes and that
concerns the use of dma_request_slave_channel().

Fixes: 706e2c88 ("ASoC: fsl_asrc_dma: Reuse the dma channel if available in Back-End")
Co-developed-by: default avatarNatalia Petrova <n.petrova@fintech.ru>
Signed-off-by: default avatarNikita Zhandarovich <n.zhandarovich@fintech.ru>
Acked-by: default avatarShengjiu Wang <shengjiu.wang@gmail.com>
Link: https://lore.kernel.org/r/20230417133242.53339-1-n.zhandarovich@fintech.ruSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 23878715
...@@ -209,14 +209,19 @@ static int fsl_asrc_dma_hw_params(struct snd_soc_component *component, ...@@ -209,14 +209,19 @@ static int fsl_asrc_dma_hw_params(struct snd_soc_component *component,
be_chan = soc_component_to_pcm(component_be)->chan[substream->stream]; be_chan = soc_component_to_pcm(component_be)->chan[substream->stream];
tmp_chan = be_chan; tmp_chan = be_chan;
} }
if (!tmp_chan) if (!tmp_chan) {
tmp_chan = dma_request_slave_channel(dev_be, tx ? "tx" : "rx"); tmp_chan = dma_request_chan(dev_be, tx ? "tx" : "rx");
if (IS_ERR(tmp_chan)) {
dev_err(dev, "failed to request DMA channel for Back-End\n");
return -EINVAL;
}
}
/* /*
* An EDMA DEV_TO_DEV channel is fixed and bound with DMA event of each * An EDMA DEV_TO_DEV channel is fixed and bound with DMA event of each
* peripheral, unlike SDMA channel that is allocated dynamically. So no * peripheral, unlike SDMA channel that is allocated dynamically. So no
* need to configure dma_request and dma_request2, but get dma_chan of * need to configure dma_request and dma_request2, but get dma_chan of
* Back-End device directly via dma_request_slave_channel. * Back-End device directly via dma_request_chan.
*/ */
if (!asrc->use_edma) { if (!asrc->use_edma) {
/* Get DMA request of Back-End */ /* Get DMA request of Back-End */
......
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