diff options
| -rw-r--r-- | sound/usb/mixer.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 1beb5b4d027e..b8ce651e392c 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -1469,6 +1469,12 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, | |||
| 1469 | __u8 *bmaControls; | 1469 | __u8 *bmaControls; |
| 1470 | 1470 | ||
| 1471 | if (state->mixer->protocol == UAC_VERSION_1) { | 1471 | if (state->mixer->protocol == UAC_VERSION_1) { |
| 1472 | if (hdr->bLength < 7) { | ||
| 1473 | usb_audio_err(state->chip, | ||
| 1474 | "unit %u: invalid UAC_FEATURE_UNIT descriptor\n", | ||
| 1475 | unitid); | ||
| 1476 | return -EINVAL; | ||
| 1477 | } | ||
| 1472 | csize = hdr->bControlSize; | 1478 | csize = hdr->bControlSize; |
| 1473 | if (!csize) { | 1479 | if (!csize) { |
| 1474 | usb_audio_dbg(state->chip, | 1480 | usb_audio_dbg(state->chip, |
| @@ -1486,6 +1492,12 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, | |||
| 1486 | } | 1492 | } |
| 1487 | } else { | 1493 | } else { |
| 1488 | struct uac2_feature_unit_descriptor *ftr = _ftr; | 1494 | struct uac2_feature_unit_descriptor *ftr = _ftr; |
| 1495 | if (hdr->bLength < 6) { | ||
| 1496 | usb_audio_err(state->chip, | ||
| 1497 | "unit %u: invalid UAC_FEATURE_UNIT descriptor\n", | ||
| 1498 | unitid); | ||
| 1499 | return -EINVAL; | ||
| 1500 | } | ||
| 1489 | csize = 4; | 1501 | csize = 4; |
| 1490 | channels = (hdr->bLength - 6) / 4 - 1; | 1502 | channels = (hdr->bLength - 6) / 4 - 1; |
| 1491 | bmaControls = ftr->bmaControls; | 1503 | bmaControls = ftr->bmaControls; |
