diff mbox series

ASoC: ops: Fix wraparound for mask in snd_soc_get_volsw

Message ID 20240326010131.6211-1-slee08177@gmail.com
State Accepted
Commit fc563aa900659a850e2ada4af26b9d7a3de6c591
Headers show
Series ASoC: ops: Fix wraparound for mask in snd_soc_get_volsw | expand

Commit Message

Stephen Lee March 26, 2024, 1:01 a.m. UTC
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(-)

Comments

Mark Brown March 28, 2024, 7:28 p.m. UTC | #1
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.
Mark Brown March 29, 2024, 1:29 a.m. UTC | #2
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 mbox series

Patch

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;