Skip to content

Commit b61f346

Browse files
Dan Carpentergregkh
authored andcommitted
ALSA: usb-audio: Fix a DMA to stack memory bug
commit f7d306b47a24367302bd4fe846854e07752ffcd9 upstream. 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: b909df18ce2a ("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]> Signed-off-by: Benoît Sevens <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 4c24703 commit b61f346

File tree

1 file changed

+27
-15
lines changed

1 file changed

+27
-15
lines changed

sound/usb/quirks.c

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
553553
static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interface *intf)
554554
{
555555
struct usb_host_config *config = dev->actconfig;
556-
struct usb_device_descriptor new_device_descriptor;
556+
struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
557557
int err;
558558

559559
if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
@@ -564,15 +564,19 @@ static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interfac
564564
0x10, 0x43, 0x0001, 0x000a, NULL, 0);
565565
if (err < 0)
566566
dev_dbg(&dev->dev, "error sending boot message: %d\n", err);
567+
568+
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
569+
if (!new_device_descriptor)
570+
return -ENOMEM;
567571
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
568-
&new_device_descriptor, sizeof(new_device_descriptor));
572+
new_device_descriptor, sizeof(*new_device_descriptor));
569573
if (err < 0)
570574
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
571-
if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations)
575+
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
572576
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
573-
new_device_descriptor.bNumConfigurations);
577+
new_device_descriptor->bNumConfigurations);
574578
else
575-
memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
579+
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
576580
err = usb_reset_configuration(dev);
577581
if (err < 0)
578582
dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
@@ -904,7 +908,7 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)
904908
static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
905909
{
906910
struct usb_host_config *config = dev->actconfig;
907-
struct usb_device_descriptor new_device_descriptor;
911+
struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
908912
int err;
909913
u8 bootresponse[0x12];
910914
int fwsize;
@@ -939,15 +943,19 @@ static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
939943

940944
dev_dbg(&dev->dev, "device initialised!\n");
941945

946+
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
947+
if (!new_device_descriptor)
948+
return -ENOMEM;
949+
942950
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
943-
&new_device_descriptor, sizeof(new_device_descriptor));
951+
new_device_descriptor, sizeof(*new_device_descriptor));
944952
if (err < 0)
945953
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
946-
if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations)
954+
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
947955
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
948-
new_device_descriptor.bNumConfigurations);
956+
new_device_descriptor->bNumConfigurations);
949957
else
950-
memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
958+
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
951959

952960
err = usb_reset_configuration(dev);
953961
if (err < 0)
@@ -1261,7 +1269,7 @@ static void mbox3_setup_48_24_magic(struct usb_device *dev)
12611269
static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
12621270
{
12631271
struct usb_host_config *config = dev->actconfig;
1264-
struct usb_device_descriptor new_device_descriptor;
1272+
struct usb_device_descriptor *new_device_descriptor __free(kfree) = NULL;
12651273
int err;
12661274
int descriptor_size;
12671275

@@ -1274,15 +1282,19 @@ static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
12741282

12751283
dev_dbg(&dev->dev, "device initialised!\n");
12761284

1285+
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
1286+
if (!new_device_descriptor)
1287+
return -ENOMEM;
1288+
12771289
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
1278-
&new_device_descriptor, sizeof(new_device_descriptor));
1290+
new_device_descriptor, sizeof(*new_device_descriptor));
12791291
if (err < 0)
12801292
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
1281-
if (new_device_descriptor.bNumConfigurations > dev->descriptor.bNumConfigurations)
1293+
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
12821294
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
1283-
new_device_descriptor.bNumConfigurations);
1295+
new_device_descriptor->bNumConfigurations);
12841296
else
1285-
memcpy(&dev->descriptor, &new_device_descriptor, sizeof(dev->descriptor));
1297+
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
12861298

12871299
err = usb_reset_configuration(dev);
12881300
if (err < 0)

0 commit comments

Comments
 (0)