[PATCH] ASoC: sof_es8336: fix possible use-after-free in sof_es8336_remove()

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Mon Dec 5 15:41:38 CET 2022



On 12/5/22 08:37, Yang Yingliang wrote:
> sof_es8336_remove() calls cancel_delayed_work(). However, that
> function does not wait until the work function finishes. This
> means that the callback function may still be running after
> the driver's remove function has finished, which would result
> in a use-after-free.
> 
> Fix by calling cancel_delayed_work_sync(), which ensures that
> the work is properly cancelled, no longer running, and unable
> to re-schedule itself.
> 
> Fixes: 89cdb224f2ab ("ASoC: sof_es8336: reduce pop noise on speaker")
> Signed-off-by: Yang Yingliang <yangyingliang at huawei.com>

Acked-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>

> ---
>  sound/soc/intel/boards/sof_es8336.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/sound/soc/intel/boards/sof_es8336.c b/sound/soc/intel/boards/sof_es8336.c
> index 70713e4b07dc..773e5d1d87d4 100644
> --- a/sound/soc/intel/boards/sof_es8336.c
> +++ b/sound/soc/intel/boards/sof_es8336.c
> @@ -783,7 +783,7 @@ static int sof_es8336_remove(struct platform_device *pdev)
>  	struct snd_soc_card *card = platform_get_drvdata(pdev);
>  	struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
>  
> -	cancel_delayed_work(&priv->pcm_pop_work);
> +	cancel_delayed_work_sync(&priv->pcm_pop_work);
>  	gpiod_put(priv->gpio_speakers);
>  	device_remove_software_node(priv->codec_dev);
>  	put_device(priv->codec_dev);


More information about the Alsa-devel mailing list