]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ALSA: usb-audio: Fix regression on detection of Roland VS-100
authorTakashi Iwai <tiwai@suse.de>
Fri, 24 Mar 2023 07:50:05 +0000 (08:50 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Apr 2023 09:16:45 +0000 (11:16 +0200)
commit fa4e7a6fa12b1132340785e14bd439cbe95b7a5a upstream.

It's been reported that the recent kernel can't probe the PCM devices
on Roland VS-100 properly, and it turned out to be a regression by the
recent addition of the bit shift range check for the format bits.
In the old code, we just did bit-shift and it resulted in zero, which
is then corrected to the standard PCM format, while the new code
explicitly returns an error in such a case.

For addressing the regression, relax the check and fallback to the
standard PCM type (with the info output).

Fixes: 2838bcd89ebe ("ALSA: usb-audio: Fix potential out-of-bounds shift")
Cc: <stable@vger.kernel.org>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217084
Link: https://lore.kernel.org/r/20230324075005.19403-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
sound/usb/format.c

index 84b66f7c627c4c3a084c2e740f247a6a6b3939ff..11a4454c6f64c60fcc03a12314c142055ad640cf 100644 (file)
@@ -40,8 +40,12 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
        case UAC_VERSION_1:
        default: {
                struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
-               if (format >= 64)
-                       return 0; /* invalid format */
+               if (format >= 64) {
+                       usb_audio_info(chip,
+                                      "%u:%d: invalid format type 0x%llx is detected, processed as PCM\n",
+                                      fp->iface, fp->altsetting, format);
+                       format = UAC_FORMAT_TYPE_I_PCM;
+               }
                sample_width = fmt->bBitResolution;
                sample_bytes = fmt->bSubframeSize;
                format = 1ULL << format;