@@ -555,6 +555,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
555
555
static int snd_usb_extigy_boot_quirk (struct usb_device * dev , struct usb_interface * intf )
556
556
{
557
557
struct usb_host_config * config = dev -> actconfig ;
558
+ struct usb_device_descriptor new_device_descriptor ;
558
559
int err ;
559
560
560
561
if (le16_to_cpu (get_cfg_desc (config )-> wTotalLength ) == EXTIGY_FIRMWARE_SIZE_OLD ||
@@ -566,10 +567,14 @@ static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interfac
566
567
if (err < 0 )
567
568
dev_dbg (& dev -> dev , "error sending boot message: %d\n" , err );
568
569
err = usb_get_descriptor (dev , USB_DT_DEVICE , 0 ,
569
- & dev -> descriptor , sizeof (dev -> descriptor ));
570
- config = dev -> actconfig ;
570
+ & new_device_descriptor , sizeof (new_device_descriptor ));
571
571
if (err < 0 )
572
572
dev_dbg (& dev -> dev , "error usb_get_descriptor: %d\n" , err );
573
+ if (new_device_descriptor .bNumConfigurations > dev -> descriptor .bNumConfigurations )
574
+ dev_dbg (& dev -> dev , "error too large bNumConfigurations: %d\n" ,
575
+ new_device_descriptor .bNumConfigurations );
576
+ else
577
+ memcpy (& dev -> descriptor , & new_device_descriptor , sizeof (dev -> descriptor ));
573
578
err = usb_reset_configuration (dev );
574
579
if (err < 0 )
575
580
dev_dbg (& dev -> dev , "error usb_reset_configuration: %d\n" , err );
@@ -901,6 +906,7 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)
901
906
static int snd_usb_mbox2_boot_quirk (struct usb_device * dev )
902
907
{
903
908
struct usb_host_config * config = dev -> actconfig ;
909
+ struct usb_device_descriptor new_device_descriptor ;
904
910
int err ;
905
911
u8 bootresponse [0x12 ];
906
912
int fwsize ;
@@ -936,10 +942,14 @@ static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
936
942
dev_dbg (& dev -> dev , "device initialised!\n" );
937
943
938
944
err = usb_get_descriptor (dev , USB_DT_DEVICE , 0 ,
939
- & dev -> descriptor , sizeof (dev -> descriptor ));
940
- config = dev -> actconfig ;
945
+ & new_device_descriptor , sizeof (new_device_descriptor ));
941
946
if (err < 0 )
942
947
dev_dbg (& dev -> dev , "error usb_get_descriptor: %d\n" , err );
948
+ if (new_device_descriptor .bNumConfigurations > dev -> descriptor .bNumConfigurations )
949
+ dev_dbg (& dev -> dev , "error too large bNumConfigurations: %d\n" ,
950
+ new_device_descriptor .bNumConfigurations );
951
+ else
952
+ memcpy (& dev -> descriptor , & new_device_descriptor , sizeof (dev -> descriptor ));
943
953
944
954
err = usb_reset_configuration (dev );
945
955
if (err < 0 )
@@ -1249,6 +1259,7 @@ static void mbox3_setup_defaults(struct usb_device *dev)
1249
1259
static int snd_usb_mbox3_boot_quirk (struct usb_device * dev )
1250
1260
{
1251
1261
struct usb_host_config * config = dev -> actconfig ;
1262
+ struct usb_device_descriptor new_device_descriptor ;
1252
1263
int err ;
1253
1264
int descriptor_size ;
1254
1265
@@ -1262,10 +1273,14 @@ static int snd_usb_mbox3_boot_quirk(struct usb_device *dev)
1262
1273
dev_dbg (& dev -> dev , "MBOX3: device initialised!\n" );
1263
1274
1264
1275
err = usb_get_descriptor (dev , USB_DT_DEVICE , 0 ,
1265
- & dev -> descriptor , sizeof (dev -> descriptor ));
1266
- config = dev -> actconfig ;
1276
+ & new_device_descriptor , sizeof (new_device_descriptor ));
1267
1277
if (err < 0 )
1268
1278
dev_dbg (& dev -> dev , "MBOX3: error usb_get_descriptor: %d\n" , err );
1279
+ if (new_device_descriptor .bNumConfigurations > dev -> descriptor .bNumConfigurations )
1280
+ dev_dbg (& dev -> dev , "MBOX3: error too large bNumConfigurations: %d\n" ,
1281
+ new_device_descriptor .bNumConfigurations );
1282
+ else
1283
+ memcpy (& dev -> descriptor , & new_device_descriptor , sizeof (dev -> descriptor ));
1269
1284
1270
1285
err = usb_reset_configuration (dev );
1271
1286
if (err < 0 )
0 commit comments