diff mbox series

ASoC: SOF: imx-common: set sdev->pdata->hw_pdata after common is alloc'd

Message ID 20250211225018.2642-1-laurentiumihalcea111@gmail.com (mailing list archive)
State Accepted
Commit f22ba3561daa792dd138ed543e0bf48efe0b999c
Headers show
Series ASoC: SOF: imx-common: set sdev->pdata->hw_pdata after common is alloc'd | expand

Commit Message

Laurentiu Mihalcea Feb. 11, 2025, 10:50 p.m. UTC
From: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>

'imx_unregister_action' uses 'sdev->pdata->hw_pdata' to fetch the pointer
to the common data structure. As such, if 'sdev->pdata->hw_pdata' is not
set before adding 'imx_unregister_action' to the devres list, we risk
derefrencing a NULL pointer if any of the calls between
'devm_add_action_or_reset' and 'sdev->pdata->hw_pdata = common' fails.

Set 'sdev->pdata->hw_pdata' to point to 'common' as soon as 'common' is
allocated.

Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
---
 sound/soc/sof/imx/imx-common.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Frank Li Feb. 11, 2025, 11:25 p.m. UTC | #1
On Tue, Feb 11, 2025 at 05:50:18PM -0500, Laurentiu Mihalcea wrote:
> From: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
>
> 'imx_unregister_action' uses 'sdev->pdata->hw_pdata' to fetch the pointer
> to the common data structure. As such, if 'sdev->pdata->hw_pdata' is not
> set before adding 'imx_unregister_action' to the devres list, we risk
> derefrencing a NULL pointer if any of the calls between
> 'devm_add_action_or_reset' and 'sdev->pdata->hw_pdata = common' fails.
>
> Set 'sdev->pdata->hw_pdata' to point to 'common' as soon as 'common' is
> allocated.
>
> Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>

Reviewed-by: Frank Li <Frank.Li@nxp.com>

> ---
>  sound/soc/sof/imx/imx-common.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/sound/soc/sof/imx/imx-common.c b/sound/soc/sof/imx/imx-common.c
> index 82057af1436c..c3594815e60e 100644
> --- a/sound/soc/sof/imx/imx-common.c
> +++ b/sound/soc/sof/imx/imx-common.c
> @@ -378,6 +378,7 @@ static int imx_probe(struct snd_sof_dev *sdev)
>  	if (!common)
>  		return dev_err_probe(sdev->dev, -ENOMEM,
>  				     "failed to allocate common data\n");
> +	sdev->pdata->hw_pdata = common;
>
>  	common->ipc_dev = platform_device_register_data(sdev->dev, "imx-dsp",
>  							PLATFORM_DEVID_NONE,
> @@ -436,7 +437,6 @@ static int imx_probe(struct snd_sof_dev *sdev)
>  	imx_dsp_set_data(common->ipc_handle, sdev);
>
>  	sdev->num_cores = 1;
> -	sdev->pdata->hw_pdata = common;
>  	sdev->mailbox_bar = SOF_FW_BLK_TYPE_SRAM;
>  	sdev->dsp_box.offset = get_chip_info(sdev)->ipc_info.boot_mbox_offset;
>
> --
> 2.34.1
>
Daniel Baluta Feb. 12, 2025, 9:22 a.m. UTC | #2
On Wed, Feb 12, 2025 at 12:50 AM Laurentiu Mihalcea
<laurentiumihalcea111@gmail.com> wrote:
>
> From: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>
>
> 'imx_unregister_action' uses 'sdev->pdata->hw_pdata' to fetch the pointer
> to the common data structure. As such, if 'sdev->pdata->hw_pdata' is not
> set before adding 'imx_unregister_action' to the devres list, we risk
> derefrencing a NULL pointer if any of the calls between
> 'devm_add_action_or_reset' and 'sdev->pdata->hw_pdata = common' fails.
>
> Set 'sdev->pdata->hw_pdata' to point to 'common' as soon as 'common' is
> allocated.
>
> Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com>

Fixes: 651e0ed391b1 (" ASoC: SOF: imx: introduce more common
structures and functions")

Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Mark Brown Feb. 13, 2025, 1:41 p.m. UTC | #3
On Tue, 11 Feb 2025 17:50:18 -0500, Laurentiu Mihalcea wrote:
> 'imx_unregister_action' uses 'sdev->pdata->hw_pdata' to fetch the pointer
> to the common data structure. As such, if 'sdev->pdata->hw_pdata' is not
> set before adding 'imx_unregister_action' to the devres list, we risk
> derefrencing a NULL pointer if any of the calls between
> 'devm_add_action_or_reset' and 'sdev->pdata->hw_pdata = common' fails.
> 
> Set 'sdev->pdata->hw_pdata' to point to 'common' as soon as 'common' is
> allocated.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: SOF: imx-common: set sdev->pdata->hw_pdata after common is alloc'd
      commit: f22ba3561daa792dd138ed543e0bf48efe0b999c

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
diff mbox series

Patch

diff --git a/sound/soc/sof/imx/imx-common.c b/sound/soc/sof/imx/imx-common.c
index 82057af1436c..c3594815e60e 100644
--- a/sound/soc/sof/imx/imx-common.c
+++ b/sound/soc/sof/imx/imx-common.c
@@ -378,6 +378,7 @@  static int imx_probe(struct snd_sof_dev *sdev)
 	if (!common)
 		return dev_err_probe(sdev->dev, -ENOMEM,
 				     "failed to allocate common data\n");
+	sdev->pdata->hw_pdata = common;
 
 	common->ipc_dev = platform_device_register_data(sdev->dev, "imx-dsp",
 							PLATFORM_DEVID_NONE,
@@ -436,7 +437,6 @@  static int imx_probe(struct snd_sof_dev *sdev)
 	imx_dsp_set_data(common->ipc_handle, sdev);
 
 	sdev->num_cores = 1;
-	sdev->pdata->hw_pdata = common;
 	sdev->mailbox_bar = SOF_FW_BLK_TYPE_SRAM;
 	sdev->dsp_box.offset = get_chip_info(sdev)->ipc_info.boot_mbox_offset;