summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/hdac_hda.c
diff options
context:
space:
mode:
authorMeng Tang <tangmeng@uniontech.com>2022-03-02 17:43:51 +0800
committerMark Brown <broonie@kernel.org>2022-03-03 12:48:36 +0000
commite94769900f4302b4034945e5d9ec8262a2f5e086 (patch)
treec2d630a64aaeb61d6ad807553c9cb8f9116303ca /sound/soc/codecs/hdac_hda.c
parent227178d238b3ebdc2347045b52e2f2a8d4809a11 (diff)
ASoC: hdac_hda: Avoid unexpected match when pcm_name is "Analog"
pcm name can be "Analog" and "Alt Analog", cpcm->name can be "Analog Codec DAI" and "Alt Analog Codec DAI". When pcm_name is "Analog", "Analog Codec DAI" and "Alt Analog Codec DAI" are both satisfy the 'if (strstr(cpcm->name, pcm_name))' condition, which may cause the returned cpcm to be "Alt Analog Codec DAI". Even if we get the pcm name by id, and "Analog Codec DAI" goes into the loop before "Alt Analog Codec DAI", but I still think we'd better have multiple insurances against unexpected return values. After, we can correctly return the expected result even if other relevant places are changed. Signed-off-by: Meng Tang <tangmeng@uniontech.com> Link: https://lore.kernel.org/r/20220302094351.3487-1-tangmeng@uniontech.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/codecs/hdac_hda.c')
-rw-r--r--sound/soc/codecs/hdac_hda.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c
index de5955db0a5f..402e049dfcd7 100644
--- a/sound/soc/codecs/hdac_hda.c
+++ b/sound/soc/codecs/hdac_hda.c
@@ -363,8 +363,13 @@ static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt,
}
list_for_each_entry(cpcm, &hcodec->pcm_list_head, list) {
- if (strstr(cpcm->name, pcm_name))
+ if (strstr(cpcm->name, pcm_name)) {
+ if (strcmp(pcm_name, "Analog") == 0) {
+ if (strstr(cpcm->name, "Alt Analog"))
+ continue;
+ }
return cpcm;
+ }
}
dev_err(&hcodec->core.dev, "didn't find PCM for DAI %s\n", dai->name);