[PATCH] mailbox: mtk-adsp: fix UAF during device teardown

Jassi Brar jassisinghbrar at gmail.com
Mon May 18 12:04:01 PDT 2026


On Mon, Apr 27, 2026 at 9:56 PM Sergey Senozhatsky
<senozhatsky at chromium.org> wrote:
>
> When the SOF audio driver fails to initialize (e.g. firmware boot
> timeout), its devres unwind frees the snd_sof_dev object that the
> mailbox client (mtk-adsp-ipc) reaches via chan->cl->rx_callback.
> The mtk-adsp-mailbox shutdown clears the mailbox command registers
> but leaves the IRQ line unmasked, so a late interrupt can still
> queue a threaded handler after mbox_free_channel() had cleared
> chan->cl, and mbox_chan_received_data() would then trigger UAF:
>
>   BUG: KASAN: slab-use-after-free in sof_ipc3_validate_fw_version
>    sof_ipc3_validate_fw_version
>    sof_ipc3_do_rx_work
>    sof_ipc3_rx_msg
>    mt8196_dsp_handle_request
>    mtk_adsp_ipc_recv
>    mbox_chan_received_data
>    mtk_adsp_mbox_isr
>    irq_thread_fn
>   Freed by task ...:
>    kfree
>    devres_release_all
>    really_probe
>    ... (sof-audio-of-mt8196 probe failure)
>
> The crash was observed roughly three seconds after the failed probe.
>
> disable_irq() in shutdown and enable_irq() in startup. disable_irq()
> also waits for any in-flight interrupts, so by the time
> mbox_free_channel() proceeds to clear chan->cl no rx_callback can run.
>
> In addition, request the IRQ with IRQF_NO_AUTOEN so it stays masked
> between probe and the first client bind — otherwise an early interrupt
> can crash on chan->cl == NULL in mbox_chan_received_data().
>
> Fixes: af2dfa96c52d ("mailbox: mediatek: add support for adsp mailbox controller")
> Signed-off-by: Sergey Senozhatsky <senozhatsky at chromium.org>
> ---
>  drivers/mailbox/mtk-adsp-mailbox.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mailbox/mtk-adsp-mailbox.c b/drivers/mailbox/mtk-adsp-mailbox.c
> index 91487aa4d7da..8bcecddee0eb 100644
> --- a/drivers/mailbox/mtk-adsp-mailbox.c
> +++ b/drivers/mailbox/mtk-adsp-mailbox.c
> @@ -19,6 +19,7 @@ struct mtk_adsp_mbox_priv {
>         struct mbox_controller mbox;
>         void __iomem *va_mboxreg;
>         const struct mtk_adsp_mbox_cfg *cfg;
> +       int irq;
>  };
>
>  struct mtk_adsp_mbox_cfg {
> @@ -67,6 +68,8 @@ static int mtk_adsp_mbox_startup(struct mbox_chan *chan)
>         writel(0xFFFFFFFF, priv->va_mboxreg + priv->cfg->clr_in);
>         writel(0xFFFFFFFF, priv->va_mboxreg + priv->cfg->clr_out);
>
> +       enable_irq(priv->irq);
> +
>         return 0;
>  }
>
> @@ -74,6 +77,8 @@ static void mtk_adsp_mbox_shutdown(struct mbox_chan *chan)
>  {
>         struct mtk_adsp_mbox_priv *priv = get_mtk_adsp_mbox_priv(chan->mbox);
>
> +       disable_irq(priv->irq);
> +
>         /* Clear ADSP mbox command */
>         writel(0xFFFFFFFF, priv->va_mboxreg + priv->cfg->clr_in);
>         writel(0xFFFFFFFF, priv->va_mboxreg + priv->cfg->clr_out);
> @@ -139,8 +144,10 @@ static int mtk_adsp_mbox_probe(struct platform_device *pdev)
>         if (irq < 0)
>                 return irq;
>
> +       priv->irq = irq;
>         ret = devm_request_threaded_irq(dev, irq, mtk_adsp_mbox_irq,
> -                                       mtk_adsp_mbox_isr, IRQF_TRIGGER_NONE,
> +                                       mtk_adsp_mbox_isr,
> +                                       IRQF_TRIGGER_NONE | IRQF_NO_AUTOEN,
>                                         dev_name(dev), mbox->chans);
>         if (ret < 0)
>                 return ret;
> --
> 2.54.0.545.g6539524ca2-goog
>
Applied to mailbox/for-next
Thanks
Jassi



More information about the Linux-mediatek mailing list