Message ID | 20240326010131.6211-1-slee08177@gmail.com (mailing list archive) |
---|---|
State | Accepted |
Commit | fc563aa900659a850e2ada4af26b9d7a3de6c591 |
Headers | show |
Series | ASoC: ops: Fix wraparound for mask in snd_soc_get_volsw | expand |
On Mon, Mar 25, 2024 at 06:01:31PM -0700, Stephen Lee wrote: > This seems to show up in quite a few places in the alsa subsystem, > should they be addressed altogether? Probably worth it, yes.
On Mon, 25 Mar 2024 18:01:31 -0700, Stephen Lee wrote: > 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. > > [...] Applied to https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next Thanks! [1/1] ASoC: ops: Fix wraparound for mask in snd_soc_get_volsw commit: fc563aa900659a850e2ada4af26b9d7a3de6c591 All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c index 2d25748ca706..b27e89ff6a16 100644 --- a/sound/soc/soc-ops.c +++ b/sound/soc/soc-ops.c @@ -263,7 +263,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;
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> --- This seems to show up in quite a few places in the alsa subsystem, should they be addressed altogether? --- sound/soc/soc-ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)