mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 22:23:14 -04:00
Merge tag 'ASB-2025-01-05_11-5.4' of https://android.googlesource.com/kernel/common into android13-5.4-lahaina
https://source.android.com/docs/security/bulletin/2025-01-01 * tag 'ASB-2025-01-05_11-5.4' of https://android.googlesource.com/kernel/common: UPSTREAM: ALSA: usb-audio: Fix a DMA to stack memory bug UPSTREAM: ALSA: usb-audio: Fix out of bounds reads when finding clock sources UPSTREAM: ALSA: usb-audio: Fix potential out-of-bound accesses for Extigy and Mbox devices Revert "UPSTREAM: unicode: Don't special case ignorable code points" Reapply "UPSTREAM: unicode: Don't special case ignorable code points" Revert "UPSTREAM: unicode: Don't special case ignorable code points" Change-Id: Ibfa7592f50072262205201b39dd2e37a1ee3c289
This commit is contained in:
commit
3bc8134025
4 changed files with 3482 additions and 3353 deletions
|
|
@ -2230,6 +2230,75 @@ static void nfdicf_init(void)
|
|||
file_fail(fold_name);
|
||||
}
|
||||
|
||||
static void ignore_init(void)
|
||||
{
|
||||
FILE *file;
|
||||
unsigned int unichar;
|
||||
unsigned int first;
|
||||
unsigned int last;
|
||||
unsigned int *um;
|
||||
int count;
|
||||
int ret;
|
||||
|
||||
if (verbose > 0)
|
||||
printf("Parsing %s\n", prop_name);
|
||||
file = fopen(prop_name, "r");
|
||||
if (!file)
|
||||
open_fail(prop_name, errno);
|
||||
assert(file);
|
||||
count = 0;
|
||||
while (fgets(line, LINESIZE, file)) {
|
||||
ret = sscanf(line, "%X..%X ; %s # ", &first, &last, buf0);
|
||||
if (ret == 3) {
|
||||
if (strcmp(buf0, "Default_Ignorable_Code_Point"))
|
||||
continue;
|
||||
if (!utf32valid(first) || !utf32valid(last))
|
||||
line_fail(prop_name, line);
|
||||
for (unichar = first; unichar <= last; unichar++) {
|
||||
free(unicode_data[unichar].utf32nfdi);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdi = um;
|
||||
free(unicode_data[unichar].utf32nfdicf);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdicf = um;
|
||||
count++;
|
||||
}
|
||||
if (verbose > 1)
|
||||
printf(" %X..%X Default_Ignorable_Code_Point\n",
|
||||
first, last);
|
||||
continue;
|
||||
}
|
||||
ret = sscanf(line, "%X ; %s # ", &unichar, buf0);
|
||||
if (ret == 2) {
|
||||
if (strcmp(buf0, "Default_Ignorable_Code_Point"))
|
||||
continue;
|
||||
if (!utf32valid(unichar))
|
||||
line_fail(prop_name, line);
|
||||
free(unicode_data[unichar].utf32nfdi);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdi = um;
|
||||
free(unicode_data[unichar].utf32nfdicf);
|
||||
um = malloc(sizeof(unsigned int));
|
||||
*um = 0;
|
||||
unicode_data[unichar].utf32nfdicf = um;
|
||||
if (verbose > 1)
|
||||
printf(" %X Default_Ignorable_Code_Point\n",
|
||||
unichar);
|
||||
count++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
fclose(file);
|
||||
|
||||
if (verbose > 0)
|
||||
printf("Found %d entries\n", count);
|
||||
if (count == 0)
|
||||
file_fail(prop_name);
|
||||
}
|
||||
|
||||
static void corrections_init(void)
|
||||
{
|
||||
FILE *file;
|
||||
|
|
@ -3327,6 +3396,7 @@ int main(int argc, char *argv[])
|
|||
ccc_init();
|
||||
nfdi_init();
|
||||
nfdicf_init();
|
||||
ignore_init();
|
||||
corrections_init();
|
||||
hangul_decompose();
|
||||
nfdi_decompose();
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -21,6 +21,10 @@
|
|||
#include "clock.h"
|
||||
#include "quirks.h"
|
||||
|
||||
/* check whether the descriptor bLength has the minimal length */
|
||||
#define DESC_LENGTH_CHECK(p) \
|
||||
(p->bLength >= sizeof(*p))
|
||||
|
||||
static void *find_uac_clock_desc(struct usb_host_interface *iface, int id,
|
||||
bool (*validator)(void *, int), u8 type)
|
||||
{
|
||||
|
|
@ -38,36 +42,60 @@ static void *find_uac_clock_desc(struct usb_host_interface *iface, int id,
|
|||
static bool validate_clock_source_v2(void *p, int id)
|
||||
{
|
||||
struct uac_clock_source_descriptor *cs = p;
|
||||
if (!DESC_LENGTH_CHECK(cs))
|
||||
return false;
|
||||
return cs->bClockID == id;
|
||||
}
|
||||
|
||||
static bool validate_clock_source_v3(void *p, int id)
|
||||
{
|
||||
struct uac3_clock_source_descriptor *cs = p;
|
||||
if (!DESC_LENGTH_CHECK(cs))
|
||||
return false;
|
||||
return cs->bClockID == id;
|
||||
}
|
||||
|
||||
static bool validate_clock_selector_v2(void *p, int id)
|
||||
{
|
||||
struct uac_clock_selector_descriptor *cs = p;
|
||||
return cs->bClockID == id;
|
||||
if (!DESC_LENGTH_CHECK(cs))
|
||||
return false;
|
||||
if (cs->bClockID != id)
|
||||
return false;
|
||||
/* additional length check for baCSourceID array (in bNrInPins size)
|
||||
* and two more fields (which sizes depend on the protocol)
|
||||
*/
|
||||
return cs->bLength >= sizeof(*cs) + cs->bNrInPins +
|
||||
1 /* bmControls */ + 1 /* iClockSelector */;
|
||||
}
|
||||
|
||||
static bool validate_clock_selector_v3(void *p, int id)
|
||||
{
|
||||
struct uac3_clock_selector_descriptor *cs = p;
|
||||
return cs->bClockID == id;
|
||||
if (!DESC_LENGTH_CHECK(cs))
|
||||
return false;
|
||||
if (cs->bClockID != id)
|
||||
return false;
|
||||
/* additional length check for baCSourceID array (in bNrInPins size)
|
||||
* and two more fields (which sizes depend on the protocol)
|
||||
*/
|
||||
return cs->bLength >= sizeof(*cs) + cs->bNrInPins +
|
||||
4 /* bmControls */ + 2 /* wCSelectorDescrStr */;
|
||||
}
|
||||
|
||||
static bool validate_clock_multiplier_v2(void *p, int id)
|
||||
{
|
||||
struct uac_clock_multiplier_descriptor *cs = p;
|
||||
if (!DESC_LENGTH_CHECK(cs))
|
||||
return false;
|
||||
return cs->bClockID == id;
|
||||
}
|
||||
|
||||
static bool validate_clock_multiplier_v3(void *p, int id)
|
||||
{
|
||||
struct uac3_clock_multiplier_descriptor *cs = p;
|
||||
if (!DESC_LENGTH_CHECK(cs))
|
||||
return false;
|
||||
return cs->bClockID == id;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -585,6 +585,7 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
|
|||
static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interface *intf)
|
||||
{
|
||||
struct usb_host_config *config = dev->actconfig;
|
||||
struct usb_device_descriptor *new_device_descriptor = NULL;
|
||||
int err;
|
||||
|
||||
if (le16_to_cpu(get_cfg_desc(config)->wTotalLength) == EXTIGY_FIRMWARE_SIZE_OLD ||
|
||||
|
|
@ -595,11 +596,20 @@ static int snd_usb_extigy_boot_quirk(struct usb_device *dev, struct usb_interfac
|
|||
0x10, 0x43, 0x0001, 0x000a, NULL, 0);
|
||||
if (err < 0)
|
||||
dev_dbg(&dev->dev, "error sending boot message: %d\n", err);
|
||||
|
||||
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
|
||||
if (!new_device_descriptor)
|
||||
return -ENOMEM;
|
||||
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
|
||||
&dev->descriptor, sizeof(dev->descriptor));
|
||||
config = dev->actconfig;
|
||||
new_device_descriptor, sizeof(*new_device_descriptor));
|
||||
if (err < 0)
|
||||
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
|
||||
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
|
||||
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
|
||||
new_device_descriptor->bNumConfigurations);
|
||||
else
|
||||
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
|
||||
kfree(new_device_descriptor);
|
||||
err = usb_reset_configuration(dev);
|
||||
if (err < 0)
|
||||
dev_dbg(&dev->dev, "error usb_reset_configuration: %d\n", err);
|
||||
|
|
@ -933,6 +943,7 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)
|
|||
static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
|
||||
{
|
||||
struct usb_host_config *config = dev->actconfig;
|
||||
struct usb_device_descriptor *new_device_descriptor = NULL;
|
||||
int err;
|
||||
u8 bootresponse[0x12];
|
||||
int fwsize;
|
||||
|
|
@ -967,11 +978,21 @@ static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
|
|||
|
||||
dev_dbg(&dev->dev, "device initialised!\n");
|
||||
|
||||
new_device_descriptor = kmalloc(sizeof(*new_device_descriptor), GFP_KERNEL);
|
||||
if (!new_device_descriptor)
|
||||
return -ENOMEM;
|
||||
|
||||
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
|
||||
&dev->descriptor, sizeof(dev->descriptor));
|
||||
config = dev->actconfig;
|
||||
new_device_descriptor, sizeof(*new_device_descriptor));
|
||||
if (err < 0)
|
||||
dev_dbg(&dev->dev, "error usb_get_descriptor: %d\n", err);
|
||||
if (new_device_descriptor->bNumConfigurations > dev->descriptor.bNumConfigurations)
|
||||
dev_dbg(&dev->dev, "error too large bNumConfigurations: %d\n",
|
||||
new_device_descriptor->bNumConfigurations);
|
||||
else
|
||||
memcpy(&dev->descriptor, new_device_descriptor, sizeof(dev->descriptor));
|
||||
|
||||
kfree(new_device_descriptor);
|
||||
|
||||
err = usb_reset_configuration(dev);
|
||||
if (err < 0)
|
||||
|
|
@ -1018,7 +1039,6 @@ static int snd_usb_axefx3_boot_quirk(struct usb_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#define MICROBOOK_BUF_SIZE 128
|
||||
|
||||
static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf,
|
||||
|
|
|
|||
Loading…
Reference in a new issue