summaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2017-05-30 17:24:45 -0400
committerTakashi Iwai <tiwai@suse.de>2017-05-31 02:46:19 -0400
commite49a14fa36aeb72476e038fcde96c151b7e4ecc8 (patch)
treec4457b641b8a8b6fcc70ed679c1a20c8aa544cb7 /sound/usb
parent617163fc2580da3d489b6c1bacb6312e0e2aac02 (diff)
ALSA: usb: Avoid VLA in mixer_us16x08.c
This is another attempt to work around the VLA used in mixer_us16x08.c. Basically the temporary array is used individually for two cases, and we can declare locally in each block, instead of hackish max() usage. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/mixer_us16x08.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sound/usb/mixer_us16x08.c b/sound/usb/mixer_us16x08.c
index 442d8f7998e3..26ed23b18b77 100644
--- a/sound/usb/mixer_us16x08.c
+++ b/sound/usb/mixer_us16x08.c
@@ -698,16 +698,18 @@ static int snd_us16x08_meter_get(struct snd_kcontrol *kcontrol,
698 struct snd_usb_audio *chip = elem->head.mixer->chip; 698 struct snd_usb_audio *chip = elem->head.mixer->chip;
699 struct snd_us16x08_meter_store *store = elem->private_data; 699 struct snd_us16x08_meter_store *store = elem->private_data;
700 u8 meter_urb[64]; 700 u8 meter_urb[64];
701 char tmp[max(sizeof(mix_init_msg1), sizeof(mix_init_msg2))];
702 701
703 switch (kcontrol->private_value) { 702 switch (kcontrol->private_value) {
704 case 0: 703 case 0: {
704 char tmp[sizeof(mix_init_msg1)];
705
705 memcpy(tmp, mix_init_msg1, sizeof(mix_init_msg1)); 706 memcpy(tmp, mix_init_msg1, sizeof(mix_init_msg1));
706 snd_us16x08_send_urb(chip, tmp, 4); 707 snd_us16x08_send_urb(chip, tmp, 4);
707 snd_us16x08_recv_urb(chip, meter_urb, 708 snd_us16x08_recv_urb(chip, meter_urb,
708 sizeof(meter_urb)); 709 sizeof(meter_urb));
709 kcontrol->private_value++; 710 kcontrol->private_value++;
710 break; 711 break;
712 }
711 case 1: 713 case 1:
712 snd_us16x08_recv_urb(chip, meter_urb, 714 snd_us16x08_recv_urb(chip, meter_urb,
713 sizeof(meter_urb)); 715 sizeof(meter_urb));
@@ -718,7 +720,9 @@ static int snd_us16x08_meter_get(struct snd_kcontrol *kcontrol,
718 sizeof(meter_urb)); 720 sizeof(meter_urb));
719 kcontrol->private_value++; 721 kcontrol->private_value++;
720 break; 722 break;
721 case 3: 723 case 3: {
724 char tmp[sizeof(mix_init_msg2)];
725
722 memcpy(tmp, mix_init_msg2, sizeof(mix_init_msg2)); 726 memcpy(tmp, mix_init_msg2, sizeof(mix_init_msg2));
723 tmp[2] = snd_get_meter_comp_index(store); 727 tmp[2] = snd_get_meter_comp_index(store);
724 snd_us16x08_send_urb(chip, tmp, 10); 728 snd_us16x08_send_urb(chip, tmp, 10);
@@ -727,6 +731,7 @@ static int snd_us16x08_meter_get(struct snd_kcontrol *kcontrol,
727 kcontrol->private_value = 0; 731 kcontrol->private_value = 0;
728 break; 732 break;
729 } 733 }
734 }
730 735
731 for (set = 0; set < 6; set++) 736 for (set = 0; set < 6; set++)
732 get_meter_levels_from_urb(set, store, meter_urb); 737 get_meter_levels_from_urb(set, store, meter_urb);