From nobody Tue Apr 7 01:03:00 2026 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 46F73329E5C for ; Tue, 17 Mar 2026 04:22:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773721356; cv=none; b=cGe7xPSZC9ZMRjBIEVnMc/4UDBmuDVTzHa7aSXDZ9OedZoIQTkr2JLKeYTDsy8Lv5wVpH4z7swfxZWj99XKXFxvexawIWcSDDNIfqesOCksVR+bU8Nvbf2EmAyvKz0RAtPMrPQa/GDfXRid9LMTVgjW4kF4GhsYNibL1Soju+Fc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773721356; c=relaxed/simple; bh=6DzbO4Ml1aHb3e7Sda0Z2wIyPUN3e5Y8nB2T9Ja5BYI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=pOFMl8c33uYO0602OzzlhVT2t5b6oyxC3MRfB2Zf9/CwXUdhmuVTWzDsMj7FhP6DYN2gFbbw/iapU8s58fay3OIvMwUPfcgyWfxxwVzg//PNjPt4LC5qQS972TDhr7qzBwPuYxH2gTM+evY3j96hf00H2c5BRo6n6YSDg6bE5s4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XiHX7FOk; arc=none smtp.client-ip=74.125.82.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XiHX7FOk" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-128ebee22caso3210198c88.0 for ; Mon, 16 Mar 2026 21:22:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773721353; x=1774326153; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=NbNGfKsBjjjuyphN4yp+QwSP8eo9AaRUsQZLKwzJdEM=; b=XiHX7FOk1TpEtw5BBENjN5R5OVa6XYyUQSXB6QrzFn71XWClOoKBqQjPZkO6JGMAPj +4SGnRb3Xs5XIDDl9frE00M+MPtd8BMesunVXntsReaXaVlVEz68nyAP2B5+aSzPAsmX YDSgG0badPp4lNgKHCZFVVCdEhQURKnYhokparstxPF3tpxl7BdbA8oO2pPFXA2JN50h pnrTSjlf+OTiqIDbEL47s0eRHgws7XFBdADqrE3Fdn5dg3lvQ2CqokkJhCNosOZXe7zY 3f/ZfUqziuxz9elv87bj2XAu2R8nWxN7q7q7f50cDixuToLlMP52hsZFZYdhUcl1hTra rPCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773721353; x=1774326153; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=NbNGfKsBjjjuyphN4yp+QwSP8eo9AaRUsQZLKwzJdEM=; b=tQY8KRsw0aNfj0lPwfPapuqqN34dbLgVGPwvGchJunTN+2j+HSlEyPE6MNex+UKfat tGDGZCWdol9pYt8jKNc6SkFPY+2u3i/7B0OACAJm7dXmDWIIUSfc1ITY3fJbRn4CZ9KT fD4YNO5aL3tKgeDUr8MIeiwTj9UeAIxrE6LCn2hVUG3txjU4BXzXHInHTJkwpoiez+BJ 4N1gf3uJFhYcWnFjREYYefzd+EgpE+hPUZh3bq6xrbg9CRa5ULc0Uyq23eHGOvEzepjY 98uTHKzutKay80hZMdvNfjC34cQS+803VoxlL+EkZ6x+rI0miPkVFLkoyxfm4l+naNq6 dK9w== X-Forwarded-Encrypted: i=1; AJvYcCX8EfKt8CtMgFPAL4+AiYR1yXoEOvU7/ToLEfGpGF5pM7eicK3nAvI8RGtw6na68iGGUfL1ntTr/a7x9hM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4yEzOjEyf0tG740UpwntFVXuPKWNl84a3Yjo1lk9td58CpRI3 Pi+XZ/02/pWjDpZUIXGqEffKaOQO7m9LIuOg5H0lAozH3lxwjPyNCC3n X-Gm-Gg: ATEYQzzBkUKlNOnQLjIpraMT7+dbobwdroZUp4k2Pkab4mY5dprL7BkO8WoheIN+Gpf 0HUEYjwe7u+zkTv7H+Bo7GRempwxa+3CKKjUeDT+EcS5jICarwTsI7kf6c2+REVpitSwSqC4RqC qYxoWtEX5L7YxcaGXm/PYIJKbw6qmZNNKv3Vz9PgiZ6JbHN17aJqzCvpS1VDCmL1LLQ5ioq+9hP ihsIqHzw26/vH82o/ygNeG36miDipB1LN6kU1DK3exI6lf6H3/A5uLyXegxb7Nt4oR80Yc2d8fA J7tNCyYEz+Zzwj9QK/Ao6m2SxjJ2jZd7g5IKw2ZosjuMPdDA92qXcWT0ZSEV0Jtyzzfvqs6CJkX 3XqNjrmqYqAbwbJERF/ByAq4P9DXS5dPn45Ic8C4Og4uLXOZ73GftMSsnbnzU2gyIZJDSSktayN Xgf9OMgRpsbNPH6FUMIzRoVdbbYIOLG0irhptVQd2TK1LdOTjHNElPDuncOi99aIo5GPgTFj3cb qcv X-Received: by 2002:a05:7022:301:b0:127:33e0:ea44 with SMTP id a92af1059eb24-128f3e1a5b1mr7993213c88.29.1773721353075; Mon, 16 Mar 2026 21:22:33 -0700 (PDT) Received: from [192.168.1.18] (177-4-160-195.user3p.v-tal.net.br. [177.4.160.195]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-128f6295ebfsm14583318c88.4.2026.03.16.21.22.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 21:22:32 -0700 (PDT) From: =?utf-8?q?C=C3=A1ssio_Gabriel?= Date: Tue, 17 Mar 2026 01:22:04 -0300 Subject: [PATCH v2] ALSA: usb-audio: validate full match when resolving quirk aliases Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260317-alsa-usb-fix-quirk-alias-v2-1-6e531c67f0c8@gmail.com> X-B4-Tracking: v=1; b=H4sIAAAAAAAC/3WNSw6CQBBEr0J6bZv5GGRceQ/DooEBOvJzWoiGc HdHEpcuX6Xq1QriA3uBS7JC8AsLj0MEc0igbGloPHIVGYwyqbLaInVCOEuBNb/wMXO4x4hJ0Ls ys0oVlNkU4nwKPlZ29S2P3LI8x/Denxb9TX/S03/polGjNalzLqvPVNG16Ym7Yzn2kG/b9gHVn m6kwAAAAA== X-Change-ID: 20260313-alsa-usb-fix-quirk-alias-e9c8300ba836 To: Takashi Iwai Cc: Jaroslav Kysela , Greg Kroah-Hartman , linux-sound@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?C=C3=A1ssio_Gabriel?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5086; i=cassiogabrielcontato@gmail.com; h=from:subject:message-id; bh=6DzbO4Ml1aHb3e7Sda0Z2wIyPUN3e5Y8nB2T9Ja5BYI=; b=owGbwMvMwCV2IdZeKur/u2bG02pJDJk7rrN9v1Jj+COX62ziN5NbNxa+0fsucCb0o2Dg/VN+k 3W/O6SmdpSyMIhxMciKKbKsTlpkuafrwdX6uBUeMHNYmUCGMHBxCsBEgn8yMpy0u93Atk1oQYpV 5FaNOa0KNiF3JRZEqi959/ag5TlV8/WMDAvOuBRWSvYfdj8bt1QyaoXRissnJkfPnC/+ZW6l/fG IywwA X-Developer-Key: i=cassiogabrielcontato@gmail.com; a=openpgp; fpr=AB62A239BC8AE0D57F5EA848D05D3F1A5AFFEE83 get_alias_quirk() resolves a quirk for an aliased USB ID by scanning usb_audio_ids[], but it currently checks only the vendor/product pair. This is weak for quirk table entries that also depend on additional USB_DEVICE_ID match fields, such as device or interface class, subclass, protocol, interface number, or bcdDevice range. Rework the alias lookup so that it still uses the aliased vid:pid as the initial lookup key, but validates the remaining match_flags constraints of each candidate entry against the real device and interface descriptors before returning the quirk. Signed-off-by: C=C3=A1ssio Gabriel --- Changes in v2: - drop the temporary usb_device_id reconstruction approach - validate only the remaining match_flags explicitly - pass struct usb_interface * to get_alias_quirk() - Link to v1: https://lore.kernel.org/r/20260314-alsa-usb-fix-quirk-alias-v= 1-1-3269998f7ada@gmail.com --- sound/usb/card.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++---= ---- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/sound/usb/card.c b/sound/usb/card.c index fd81f32a66fb..153085a77d43 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -864,21 +864,77 @@ static void find_last_interface(struct snd_usb_audio = *chip) usb_audio_dbg(chip, "Found last interface =3D %d\n", chip->last_iface); } =20 +/* + * Match aliased vid:pid first, then validate remaining fields against + * the real device and interface descriptors. + */ +static bool snd_usb_match_alias_entry(struct usb_interface *intf, + const struct usb_device_id *id, + u32 alias_id) +{ + struct usb_device *dev =3D interface_to_usbdev(intf); + const struct usb_host_interface *alt =3D intf->cur_altsetting; + const struct usb_interface_descriptor *intfd =3D &alt->desc; + const struct usb_device_descriptor *devd =3D &dev->descriptor; + u16 bcd =3D le16_to_cpu(devd->bcdDevice); + + /* Match aliased vendor/product */ + if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && + id->idVendor !=3D USB_ID_VENDOR(alias_id)) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && + id->idProduct !=3D USB_ID_PRODUCT(alias_id)) + return false; + /* Match real device descriptor constraints */ + if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && + bcd < id->bcdDevice_lo) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && + bcd > id->bcdDevice_hi) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && + devd->bDeviceClass !=3D id->bDeviceClass) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) && + devd->bDeviceSubClass !=3D id->bDeviceSubClass) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && + devd->bDeviceProtocol !=3D id->bDeviceProtocol) + return false; + /* Match real interface descriptor constraints */ + if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && + intfd->bInterfaceClass !=3D id->bInterfaceClass) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && + intfd->bInterfaceSubClass !=3D id->bInterfaceSubClass) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && + intfd->bInterfaceProtocol !=3D id->bInterfaceProtocol) + return false; + if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER) && + intfd->bInterfaceNumber !=3D id->bInterfaceNumber) + return false; + + return true; +} + /* look for the corresponding quirk */ static const struct snd_usb_audio_quirk * -get_alias_quirk(struct usb_device *dev, unsigned int id) +get_alias_quirk(struct usb_interface *intf, unsigned int id) { const struct usb_device_id *p; =20 for (p =3D usb_audio_ids; p->match_flags; p++) { - /* FIXME: this checks only vendor:product pair in the list */ - if ((p->match_flags & USB_DEVICE_ID_MATCH_DEVICE) =3D=3D - USB_DEVICE_ID_MATCH_DEVICE && - p->idVendor =3D=3D USB_ID_VENDOR(id) && - p->idProduct =3D=3D USB_ID_PRODUCT(id)) + /* + * Alias lookup only considers entries anchored on vid:pid. + * Additional device/interface constraints are validated separately. + */ + if ((p->match_flags & USB_DEVICE_ID_MATCH_DEVICE) !=3D + USB_DEVICE_ID_MATCH_DEVICE) + continue; + if (snd_usb_match_alias_entry(intf, p, id)) return (const struct snd_usb_audio_quirk *)p->driver_info; } - return NULL; } =20 @@ -927,7 +983,7 @@ static int usb_audio_probe(struct usb_interface *intf, id =3D USB_ID(le16_to_cpu(dev->descriptor.idVendor), le16_to_cpu(dev->descriptor.idProduct)); if (get_alias_id(dev, &id)) - quirk =3D get_alias_quirk(dev, id); + quirk =3D get_alias_quirk(intf, id); if (quirk && quirk->ifnum >=3D 0 && ifnum !=3D quirk->ifnum) return -ENXIO; if (quirk && quirk->ifnum =3D=3D QUIRK_NODEV_INTERFACE) --- base-commit: dcf16b3bb87632a80ef344433980539c2785dfd4 change-id: 20260313-alsa-usb-fix-quirk-alias-e9c8300ba836 Best regards, --=20 C=C3=A1ssio Gabriel