ALSA: usb-audio: add Yamaha MOX6/MOX8 support
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / sound / usb / format.c
index 8d042dce0d16a0a2d26efffe2cceb9279f0300f9..e09aba19375cf938eafd28aedec9edf2ea55dbbe 100644 (file)
@@ -209,6 +209,8 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
        return 0;
 }
 
+#define MAX_UAC2_NR_RATES 1024
+
 /*
  * Helper function to walk the array of sample rate triplets reported by
  * the device. The problem is that we need to parse whole array first to
@@ -226,7 +228,7 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
                int min = combine_quad(&data[2 + 12 * i]);
                int max = combine_quad(&data[6 + 12 * i]);
                int res = combine_quad(&data[10 + 12 * i]);
-               int rate;
+               unsigned int rate;
 
                if ((max < 0) || (min < 0) || (res < 0) || (max < min))
                        continue;
@@ -253,6 +255,10 @@ static int parse_uac2_sample_rate_range(struct audioformat *fp, int nr_triplets,
                        fp->rates |= snd_pcm_rate_to_rate_bit(rate);
 
                        nr_rates++;
+                       if (nr_rates >= MAX_UAC2_NR_RATES) {
+                               snd_printk(KERN_ERR "invalid uac2 rates\n");
+                               break;
+                       }
 
                        /* avoid endless loop */
                        if (res == 0)
@@ -286,7 +292,7 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip,
                              USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
                              UAC2_CS_CONTROL_SAM_FREQ << 8,
                              snd_usb_ctrl_intf(chip) | (clock << 8),
-                             tmp, sizeof(tmp), 1000);
+                             tmp, sizeof(tmp));
 
        if (ret < 0) {
                snd_printk(KERN_ERR "%s(): unable to retrieve number of sample rates (clock %d)\n",
@@ -307,7 +313,7 @@ static int parse_audio_format_rates_v2(struct snd_usb_audio *chip,
                              USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN,
                              UAC2_CS_CONTROL_SAM_FREQ << 8,
                              snd_usb_ctrl_intf(chip) | (clock << 8),
-                             data, data_size, 1000);
+                             data, data_size);
 
        if (ret < 0) {
                snd_printk(KERN_ERR "%s(): unable to retrieve sample rate range (clock %d)\n",