Commit f5d76e9c authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: More strict sanity checks for clock parsers

The sanity checks introduced for malformed descriptors loosely check
the given descriptor size, although the size greater than the defined
description is invalid.  It was due to a concern of any funky firmware
in the actual products.  But this doesn't look hitting, and any sane
products must have the defined descriptors.

So in this patch, we make the validators more strict, allowing only
with the defined descriptor sizes.  The value in clock selector
validator is corrected from 5 to 7 to count the two unlisted fields
after baCSourceID[].
Suggested-by: default avatarRuslan Bilovol <ruslan.bilovol@gmail.com>
Reviewed-by: default avatarRuslan Bilovol <ruslan.bilovol@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent f7645bd6
...@@ -52,7 +52,7 @@ static void *find_uac_clock_desc(struct usb_host_interface *iface, int id, ...@@ -52,7 +52,7 @@ static void *find_uac_clock_desc(struct usb_host_interface *iface, int id,
static bool validate_clock_source_v2(void *p, int id) static bool validate_clock_source_v2(void *p, int id)
{ {
struct uac_clock_source_descriptor *cs = p; struct uac_clock_source_descriptor *cs = p;
return cs->bLength >= sizeof(*cs) && cs->bClockID == id; return cs->bLength == sizeof(*cs) && cs->bClockID == id;
} }
static bool validate_clock_source_v3(void *p, int id) static bool validate_clock_source_v3(void *p, int id)
...@@ -65,7 +65,7 @@ static bool validate_clock_selector_v2(void *p, int id) ...@@ -65,7 +65,7 @@ static bool validate_clock_selector_v2(void *p, int id)
{ {
struct uac_clock_selector_descriptor *cs = p; struct uac_clock_selector_descriptor *cs = p;
return cs->bLength >= sizeof(*cs) && cs->bClockID == id && return cs->bLength >= sizeof(*cs) && cs->bClockID == id &&
cs->bLength >= 5 + cs->bNrInPins; cs->bLength == 7 + cs->bNrInPins;
} }
static bool validate_clock_selector_v3(void *p, int id) static bool validate_clock_selector_v3(void *p, int id)
...@@ -77,7 +77,7 @@ static bool validate_clock_selector_v3(void *p, int id) ...@@ -77,7 +77,7 @@ static bool validate_clock_selector_v3(void *p, int id)
static bool validate_clock_multiplier_v2(void *p, int id) static bool validate_clock_multiplier_v2(void *p, int id)
{ {
struct uac_clock_multiplier_descriptor *cs = p; struct uac_clock_multiplier_descriptor *cs = p;
return cs->bLength >= sizeof(*cs) && cs->bClockID == id; return cs->bLength == sizeof(*cs) && cs->bClockID == id;
} }
static bool validate_clock_multiplier_v3(void *p, int id) static bool validate_clock_multiplier_v3(void *p, int id)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment