diff options
author | Takashi Iwai <tiwai@suse.de> | 2017-05-30 17:24:45 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2017-05-31 02:46:19 -0400 |
commit | e49a14fa36aeb72476e038fcde96c151b7e4ecc8 (patch) | |
tree | c4457b641b8a8b6fcc70ed679c1a20c8aa544cb7 /sound/usb | |
parent | 617163fc2580da3d489b6c1bacb6312e0e2aac02 (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.c | 11 |
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); |