]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ASoC: Intel: avs: Fix NULL pointer dereference
authorAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Thu, 24 Apr 2025 09:46:00 +0000 (11:46 +0200)
committerMark Brown <broonie@kernel.org>
Thu, 24 Apr 2025 11:56:16 +0000 (12:56 +0100)
Due to unfortunate interaction between two recent patchsets, avs driver
ends up dereferencing NULL pointer when registering i2s boards.

Commit [1] does a call to avs_mach_ssp_tdm() which requires mach->pdata,
however due to another change in [2], mach->pdata is initialized after
the call. Reshuffle code to initialise mach->pdata before calling
avs_mach_ssp_tdm().

[1]

Link: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git/commit/sound/soc/intel/avs?id=79138dbff53ab0e9891ebdfce8d7b298c3783cd1
[2]
Link: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git/commit/sound/soc/intel/avs?id=7d859189de13f06fdc511761c745f3b302bed7b6
Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Acked-by: Cezary Rojewski <cezary.rojewski@intel.com>
Link: https://patch.msgid.link/20250424094600.1678051-1-amadeuszx.slawinski@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/avs/board_selection.c

index 6f6137c3a02c8bbe3d613ad864ff0f7e17f29923..636315060eb47e1d2aa37e412bd79c9261b898a2 100644 (file)
@@ -472,14 +472,6 @@ static int avs_register_i2s_board(struct avs_dev *adev, struct snd_soc_acpi_mach
                return -ENODEV;
        }
 
-       uid = mach->mach_params.i2s_link_mask;
-       if (avs_mach_singular_ssp(mach))
-               uid = (uid << AVS_CHANNELS_MAX) + avs_mach_ssp_tdm(mach, avs_mach_ssp_port(mach));
-
-       name = devm_kasprintf(adev->dev, GFP_KERNEL, "%s.%d-platform", mach->drv_name, uid);
-       if (!name)
-               return -ENOMEM;
-
        pdata = mach->pdata;
        if (!pdata)
                pdata = devm_kzalloc(adev->dev, sizeof(*pdata), GFP_KERNEL);
@@ -488,6 +480,14 @@ static int avs_register_i2s_board(struct avs_dev *adev, struct snd_soc_acpi_mach
        pdata->obsolete_card_names = obsolete_card_names;
        mach->pdata = pdata;
 
+       uid = mach->mach_params.i2s_link_mask;
+       if (avs_mach_singular_ssp(mach))
+               uid = (uid << AVS_CHANNELS_MAX) + avs_mach_ssp_tdm(mach, avs_mach_ssp_port(mach));
+
+       name = devm_kasprintf(adev->dev, GFP_KERNEL, "%s.%d-platform", mach->drv_name, uid);
+       if (!name)
+               return -ENOMEM;
+
        ret = avs_i2s_platform_register(adev, name, mach->mach_params.i2s_link_mask, pdata->tdms);
        if (ret < 0)
                return ret;