ALSA: hda: Fix potential access overflow in beep helper
authorTakashi Iwai <tiwai@suse.de>
Tue, 7 Apr 2020 08:44:01 +0000 (10:44 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 7 Apr 2020 14:42:29 +0000 (16:42 +0200)
The beep control helper function blindly stores the values in two
stereo channels no matter whether the actual control is mono or
stereo.  This is practically harmless, but it annoys the recently
introduced sanity check, resulting in an error when the checker is
enabled.

This patch corrects the behavior to store only on the defined array
member.

Fixes: 0401e8548eac ("ALSA: hda - Move beep helper functions to hda_beep.c")
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=207139
Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20200407084402.25589-2-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_beep.c

index f5fd62ed4df5b669e43c76e99cb18f1eba243f9d..841523f6b88de62267268b3414977174e657b777 100644 (file)
@@ -290,8 +290,12 @@ int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol,
 {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
        struct hda_beep *beep = codec->beep;
+       int chs = get_amp_channels(kcontrol);
+
        if (beep && (!beep->enabled || !ctl_has_mute(kcontrol))) {
-               ucontrol->value.integer.value[0] =
+               if (chs & 1)
+                       ucontrol->value.integer.value[0] = beep->enabled;
+               if (chs & 2)
                        ucontrol->value.integer.value[1] = beep->enabled;
                return 0;
        }