staging: bcm2835-audio: Validate values written to controls
authorMark Brown <broonie@kernel.org>
Tue, 15 Apr 2025 13:31:51 +0000 (14:31 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Apr 2025 14:31:30 +0000 (16:31 +0200)
The bcm2835-audio driver makes no effort to validate the values it accepts
from userspace, causing it to accept invalid values:

# # PCM Playback Switch.0 Invalid boolean value 2
# not ok 5 write_invalid.Headphones.1
# # PCM Playback Volume.0 value -10240 less than minimum -10239
# # PCM Playback Volume.0 value 401 more than maximum 400
# not ok 12 write_invalid.Headphones.0

Add validation.

Signed-off-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250415-staging-bcm2835-alsa-limit-v1-1-4ed816e9c0fc@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c

index 1c1f040122d76dd0b1cb8c42c3d4fd9a0f4d5566..7d0ddd5c8cce4f02210ceb0b9ede43db463cc22b 100644 (file)
@@ -71,6 +71,7 @@ static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol,
                               struct snd_ctl_elem_value *ucontrol)
 {
        struct bcm2835_chip *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_ctl_elem_info info;
        int val, *valp;
        int changed = 0;
 
@@ -84,6 +85,11 @@ static int snd_bcm2835_ctl_put(struct snd_kcontrol *kcontrol,
                return -EINVAL;
 
        val = ucontrol->value.integer.value[0];
+
+       snd_bcm2835_ctl_info(kcontrol, &info);
+       if (val < info.value.integer.min || val > info.value.integer.max)
+               return -EINVAL;
+
        mutex_lock(&chip->audio_mutex);
        if (val != *valp) {
                *valp = val;