summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Lee <slee08177@gmail.com>2024-03-25 18:01:31 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-04-13 12:50:14 +0200
commita6f9bd4aee2c96d597b765af5f3a61a2b8d8e98c (patch)
tree32dd3343a1d76a20a6d9685ca713b1357a57f72b
parent06a939f72a24a7d8251f84cf4c042df86c6666ac (diff)
downloadlinux-stable-a6f9bd4aee2c96d597b765af5f3a61a2b8d8e98c.tar.gz
linux-stable-a6f9bd4aee2c96d597b765af5f3a61a2b8d8e98c.tar.bz2
linux-stable-a6f9bd4aee2c96d597b765af5f3a61a2b8d8e98c.zip
ASoC: ops: Fix wraparound for mask in snd_soc_get_volsw
[ Upstream commit fc563aa900659a850e2ada4af26b9d7a3de6c591 ] In snd_soc_info_volsw(), mask is generated by figuring out the index of the most significant bit set in max and converting the index to a bitmask through bit shift 1. Unintended wraparound occurs when max is an integer value with msb bit set. Since the bit shift value 1 is treated as an integer type, the left shift operation will wraparound and set mask to 0 instead of all 1's. In order to fix this, we type cast 1 as `1ULL` to prevent the wraparound. Fixes: 7077148fb50a ("ASoC: core: Split ops out of soc-core.c") Signed-off-by: Stephen Lee <slee08177@gmail.com> Link: https://msgid.link/r/20240326010131.6211-1-slee08177@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--sound/soc/soc-ops.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c
index e01f3bf3ef17..08ed973b2d97 100644
--- a/sound/soc/soc-ops.c
+++ b/sound/soc/soc-ops.c
@@ -252,7 +252,7 @@ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
int max = mc->max;
int min = mc->min;
int sign_bit = mc->sign_bit;
- unsigned int mask = (1 << fls(max)) - 1;
+ unsigned int mask = (1ULL << fls(max)) - 1;
unsigned int invert = mc->invert;
int val;
int ret;