ALSA: emu10k1: validate min/max values of translated controls
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Sun, 14 May 2023 17:03:19 +0000 (19:03 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 15 May 2023 20:06:19 +0000 (22:06 +0200)
User space could pass arbitrary ranges, which were uncritically
accepted. This could lead to table lookups out of range.

I don't think that this is a security issue, as it only allowed someone
with CAP_SYS_ADMIN to crash the kernel, but still.

Setting an invalid translation mode will also be rejected now. That did
no harm, but it's still better to detect errors.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230514170323.3408834-4-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/emufx.c

index fbc1bfc..796e24b 100644 (file)
@@ -769,6 +769,32 @@ static int snd_emu10k1_verify_controls(struct snd_emu10k1 *emu,
                        err = -EINVAL;
                        goto __error;
                }
+               switch (gctl->translation) {
+               case EMU10K1_GPR_TRANSLATION_NONE:
+                       break;
+               case EMU10K1_GPR_TRANSLATION_TABLE100:
+                       if (gctl->min != 0 || gctl->max != 100) {
+                               err = -EINVAL;
+                               goto __error;
+                       }
+                       break;
+               case EMU10K1_GPR_TRANSLATION_BASS:
+               case EMU10K1_GPR_TRANSLATION_TREBLE:
+                       if (gctl->min != 0 || gctl->max != 40) {
+                               err = -EINVAL;
+                               goto __error;
+                       }
+                       break;
+               case EMU10K1_GPR_TRANSLATION_ONOFF:
+                       if (gctl->min != 0 || gctl->max != 1) {
+                               err = -EINVAL;
+                               goto __error;
+                       }
+                       break;
+               default:
+                       err = -EINVAL;
+                       goto __error;
+               }
        }
        for (i = 0; i < icode->gpr_list_control_count; i++) {
                /* FIXME: we need to check the WRITE access */