]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: SOF: Intel: hda-dai: Ensure DAI widget is valid during params
authorBard Liao <yung-chuan.liao@linux.intel.com>
Tue, 3 Dec 2024 10:48:53 +0000 (18:48 +0800)
committerMark Brown <broonie@kernel.org>
Tue, 3 Dec 2024 14:40:57 +0000 (14:40 +0000)
Each cpu DAI should associate with a widget. However, the topology might
not create the right number of DAI widgets for aggregated amps. And it
will cause NULL pointer deference.
Check that the DAI widget associated with the CPU DAI is valid to prevent
NULL pointer deference due to missing DAI widgets in topologies with
aggregated amps.

Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com>
Link: https://patch.msgid.link/20241203104853.56956-1-yung-chuan.liao@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-dai.c
sound/soc/sof/intel/hda.c

index ee274d445515b469c752b9d7dcfeca42b013bf45..2a6f821c9e14e9b9c9a2667f8c6f74584a28af9e 100644 (file)
@@ -489,6 +489,12 @@ int sdw_hda_dai_hw_params(struct snd_pcm_substream *substream,
        int ret;
        int i;
 
+       if (!w) {
+               dev_err(cpu_dai->dev, "%s widget not found, check amp link num in the topology\n",
+                       cpu_dai->name);
+               return -EINVAL;
+       }
+
        ops = hda_dai_get_ops(substream, cpu_dai);
        if (!ops) {
                dev_err(cpu_dai->dev, "DAI widget ops not set\n");
@@ -568,6 +574,12 @@ int sdw_hda_dai_hw_params(struct snd_pcm_substream *substream,
         */
        for_each_rtd_cpu_dais(rtd, i, dai) {
                w = snd_soc_dai_get_widget(dai, substream->stream);
+               if (!w) {
+                       dev_err(cpu_dai->dev,
+                               "%s widget not found, check amp link num in the topology\n",
+                               dai->name);
+                       return -EINVAL;
+               }
                ipc4_copier = widget_to_copier(w);
                memcpy(&ipc4_copier->dma_config_tlv[cpu_dai_id], dma_config_tlv,
                       sizeof(*dma_config_tlv));
index 01b135068b1f808139d696a0b211865555611440..0a481575bc54d85375a481fdb5a619e0d34d68ad 100644 (file)
@@ -63,6 +63,11 @@ static int sdw_params_stream(struct device *dev,
        struct snd_soc_dapm_widget *w = snd_soc_dai_get_widget(d, params_data->substream->stream);
        struct snd_sof_dai_config_data data = { 0 };
 
+       if (!w) {
+               dev_err(dev, "%s widget not found, check amp link num in the topology\n",
+                       d->name);
+               return -EINVAL;
+       }
        data.dai_index = (params_data->link_id << 8) | d->id;
        data.dai_data = params_data->alh_stream_id;
        data.dai_node_id = data.dai_data;