[PATCH] ASoC: fsl_asrc_dma: fix potential null-ptr-deref

Shengjiu Wang shengjiu.wang at gmail.com
Wed Apr 19 14:13:00 AEST 2023


On Mon, Apr 17, 2023 at 9:33 PM Nikita Zhandarovich <
n.zhandarovich at fintech.ru> wrote:

> 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: 706e2c881158 ("ASoC: fsl_asrc_dma: Reuse the dma channel if
> available in Back-End")
> Co-developed-by: Natalia Petrova <n.petrova at fintech.ru>
> Signed-off-by: Nikita Zhandarovich <n.zhandarovich at fintech.ru>
>

Acked-by: Shengjiu Wang <shengjiu.wang at gmail.com>

Best regards
wang shengjiu

> ---
>  sound/soc/fsl/fsl_asrc_dma.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_asrc_dma.c b/sound/soc/fsl/fsl_asrc_dma.c
> index 3b81a465814a..05a7d1588d20 100644
> --- a/sound/soc/fsl/fsl_asrc_dma.c
> +++ b/sound/soc/fsl/fsl_asrc_dma.c
> @@ -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];
>                 tmp_chan = be_chan;
>         }
> -       if (!tmp_chan)
> -               tmp_chan = dma_request_slave_channel(dev_be, tx ? "tx" :
> "rx");
> +       if (!tmp_chan) {
> +               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
>          * peripheral, unlike SDMA channel that is allocated dynamically.
> So no
>          * 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) {
>                 /* Get DMA request of Back-End */
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20230419/af397e9f/attachment-0001.htm>


More information about the Linuxppc-dev mailing list