Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: codecs: Fix atomicity violation in snd_soc_component_get_drvdata()

An atomicity violation occurs when the validity of the variables
da7219->clk_src and da7219->mclk_rate is being assessed. Since the entire
assessment is not protected by a lock, the da7219 variable might still be
in flux during the assessment, rendering this check invalid.

To fix this issue, we recommend adding a lock before the block
if ((da7219->clk_src == clk_id) && (da7219->mclk_rate == freq)) so that
the legitimacy check for da7219->clk_src and da7219->mclk_rate is
protected by the lock, ensuring the validity of the check.

This possible bug is found by an experimental static analysis tool
developed by our team. This tool analyzes the locking APIs
to extract function pairs that can be concurrently executed, and then
analyzes the instructions in the paired functions to identify possible
concurrency bugs including data races and atomicity violations.

Fixes: 6d817c0e9fd7 ("ASoC: codecs: Add da7219 codec driver")
Cc: stable@vger.kernel.org
Signed-off-by: Qiu-ji Chen <chenqiuji666@gmail.com>
Link: https://patch.msgid.link/20240930101216.23723-1-chenqiuji666@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Qiu-ji Chen and committed by
Mark Brown
11577333 15909885

+6 -3
+6 -3
sound/soc/codecs/da7219.c
··· 1167 1167 struct da7219_priv *da7219 = snd_soc_component_get_drvdata(component); 1168 1168 int ret = 0; 1169 1169 1170 - if ((da7219->clk_src == clk_id) && (da7219->mclk_rate == freq)) 1170 + mutex_lock(&da7219->pll_lock); 1171 + 1172 + if ((da7219->clk_src == clk_id) && (da7219->mclk_rate == freq)) { 1173 + mutex_unlock(&da7219->pll_lock); 1171 1174 return 0; 1175 + } 1172 1176 1173 1177 if ((freq < 2000000) || (freq > 54000000)) { 1178 + mutex_unlock(&da7219->pll_lock); 1174 1179 dev_err(codec_dai->dev, "Unsupported MCLK value %d\n", 1175 1180 freq); 1176 1181 return -EINVAL; 1177 1182 } 1178 - 1179 - mutex_lock(&da7219->pll_lock); 1180 1183 1181 1184 switch (clk_id) { 1182 1185 case DA7219_CLKSRC_MCLK_SQR: