From e45d0fad00bacca06a55dee30197367916a85b41 Mon Sep 17 00:00:00 2001 From: Thorsten Blum Date: Sun, 18 Oct 2026 14:41:55 +0200 Subject: [PATCH] ALSA: usb-audio: Simplify usb_audio_make_longname() To prepare for removing strlcat() from the kernel [1], track the output length and replace strlcat() with scnprintf() and strscpy(). Replace the speed switch statement with a lookup table. No functional change. Link: https://github.com/KSPP/linux/issues/370 [1] Signed-off-by: Thorsten Blum Signed-off-by: Takashi Iwai Link: https://patch.msgid.link/20261018124155.2081-4-blum@kernel.org --- sound/usb/card.c | 71 ++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/sound/usb/card.c b/sound/usb/card.c index 8a62e8e1c6fc..59979b793fe9 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -642,63 +642,46 @@ static void usb_audio_make_longname(struct usb_device *dev, struct snd_usb_audio *chip, const struct snd_usb_audio_quirk *quirk) { + static const char * const speed_suffixes[] = { + [USB_SPEED_LOW] = ", low speed", + [USB_SPEED_FULL] = ", full speed", + [USB_SPEED_HIGH] = ", high speed", + [USB_SPEED_SUPER] = ", super speed", + [USB_SPEED_SUPER_PLUS] = ", super speed plus", + }; struct snd_card *card = chip->card; const struct usb_audio_device_name *preset; - const char *s = NULL; - int len; + enum usb_device_speed speed = snd_usb_get_speed(dev); + int len, ret; preset = lookup_device_name(chip->usb_id); /* shortcut - if any pre-defined string is given, use it */ - if (preset && preset->profile_name) - s = preset->profile_name; - if (s && *s) { - strscpy(card->longname, s, sizeof(card->longname)); + if (preset && preset->profile_name && *preset->profile_name) { + strscpy(card->longname, preset->profile_name); return; } - if (preset && preset->vendor_name) - s = preset->vendor_name; - else if (quirk && quirk->vendor_name) - s = quirk->vendor_name; *card->longname = 0; - if (s && *s) - strscpy(card->longname, s); - else if (dev->manufacturer && *dev->manufacturer) - strscpy(card->longname, dev->manufacturer); + if (preset && preset->vendor_name) + strscpy(card->longname, preset->vendor_name); + else if (quirk && quirk->vendor_name) + strscpy(card->longname, quirk->vendor_name); + if (!*card->longname) + strscpy(card->longname, dev->manufacturer ?: ""); - if (*card->longname) { - strim(card->longname); - if (*card->longname) - strlcat(card->longname, " ", sizeof(card->longname)); - } + strim(card->longname); + len = strlen(card->longname); + len += scnprintf(card->longname + len, sizeof(card->longname) - len, + "%s%s at ", len ? " " : "", card->shortname); - strlcat(card->longname, card->shortname, sizeof(card->longname)); + ret = usb_make_path(dev, card->longname + len, sizeof(card->longname) - len); + if (ret < 0) + return; + len += ret; - len = strlcat(card->longname, " at ", sizeof(card->longname)); - - if (len < sizeof(card->longname)) - usb_make_path(dev, card->longname + len, sizeof(card->longname) - len); - - switch (snd_usb_get_speed(dev)) { - case USB_SPEED_LOW: - strlcat(card->longname, ", low speed", sizeof(card->longname)); - break; - case USB_SPEED_FULL: - strlcat(card->longname, ", full speed", sizeof(card->longname)); - break; - case USB_SPEED_HIGH: - strlcat(card->longname, ", high speed", sizeof(card->longname)); - break; - case USB_SPEED_SUPER: - strlcat(card->longname, ", super speed", sizeof(card->longname)); - break; - case USB_SPEED_SUPER_PLUS: - strlcat(card->longname, ", super speed plus", sizeof(card->longname)); - break; - default: - break; - } + if (speed < ARRAY_SIZE(speed_suffixes) && speed_suffixes[speed]) + strscpy(card->longname + len, speed_suffixes[speed], sizeof(card->longname) - len); } static void snd_usb_init_quirk_flags(int idx, struct snd_usb_audio *chip)