Skip to content

Commit 8b93ba8

Browse files
committed
ALSA: usb-audio: Fix a DMA to stack memory bug
jira VULN-46737 cve-bf CVE-2024-53197 commit-author Dan Carpenter <[email protected]> commit f7d306b upstream-diff Use 5.10 LT commit e7c1fcd This kernel doesn't have snd_usb_mbox3_boot_quirk(), so that change hunk from the upstream commit isn't necessary. Also this kernel doesn't have the __free annotation, so this version calls kfree the good old fashioned way The usb_get_descriptor() function does DMA so we're not allowed to use a stack buffer for that. Doing DMA to the stack is not portable all architectures. Move the "new_device_descriptor" from being stored on the stack and allocate it with kmalloc() instead. Fixes: b909df1 ("ALSA: usb-audio: Fix potential out-of-bound accesses for Extigy and Mbox devices") Cc: [email protected] Signed-off-by: Dan Carpenter <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Takashi Iwai <[email protected]> (cherry picked from commit f7d306b) Signed-off-by: Brett Mastbergen <[email protected]>
1 parent 07d158c commit 8b93ba8

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

sound/usb/quirks.c

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
577577
static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interface *intf)
578578
{
579579
struct usb_host_config *config = dev->actconfig;
580-
struct usb_device_descriptor new_device_descriptor;
580+
struct usb_device_descriptor *new_device_descriptor = NULL;
581581
int err;
582582

583583
if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
@@ -588,15 +588,20 @@ static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interfac
588588
0x10, 0x43, 0x0001, 0x000a, NULL, 0);
589589
if (err < 0)
590590
dev_dbg(&dev->dev, "error sending boot message: %d\n", err);
591+
592+
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
593+
if (!new_device_descriptor)
594+
return -ENOMEM;
591595
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
592-
&new_device_descriptor, sizeof(new_device_descriptor));
596+
new_device_descriptor, sizeof(*new_device_descriptor));
593597
if (err < 0)
594598
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
595-
if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations)
599+
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
596600
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
597-
new_device_descriptor.bNumConfigurations);
601+
new_device_descriptor->bNumConfigurations);
598602
else
599-
memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
603+
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
604+
kfree(new_device_descriptor);
600605
err = usb_reset_configuration(dev);
601606
if (err < 0)
602607
dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
@@ -930,7 +935,7 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)
930935
static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
931936
{
932937
struct usb_host_config *config = dev->actconfig;
933-
struct usb_device_descriptor new_device_descriptor;
938+
struct usb_device_descriptor *new_device_descriptor = NULL;
934939
int err;
935940
u8 bootresponse[0x12];
936941
int fwsize;
@@ -965,15 +970,21 @@ static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
965970

966971
dev_dbg(&dev->dev, "device initialised!\n");
967972

973+
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
974+
if (!new_device_descriptor)
975+
return -ENOMEM;
976+
968977
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
969-
&new_device_descriptor, sizeof(new_device_descriptor));
978+
new_device_descriptor, sizeof(*new_device_descriptor));
970979
if (err < 0)
971980
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
972-
if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations)
981+
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
973982
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
974-
new_device_descriptor.bNumConfigurations);
983+
new_device_descriptor->bNumConfigurations);
975984
else
976-
memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
985+
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
986+
987+
kfree(new_device_descriptor);
977988

978989
err = usb_reset_configuration(dev);
979990
if (err < 0)

0 commit comments

Comments
 (0)