aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2017-11-21 10:55:51 -0500
committerTakashi Iwai <tiwai@suse.de>2017-11-21 11:50:29 -0500
commitd937cd6790a2bef2d07b500487646bd794c039bb (patch)
treec4bb62fe1c2cdcec12c0ed4a9725e19545b1e540
parent3d4e8303f2c747c8540a0a0126d0151514f6468b (diff)
ALSA: usb-audio: Add sanity checks to FE parser
When the usb-audio descriptor contains the malformed feature unit description with a too short length, the driver may access out-of-bounds. Add a sanity check of the header size at the beginning of parse_audio_feature_unit(). Fixes: 23caaf19b11e ("ALSA: usb-mixer: Add support for Audio Class v2.0") Reported-by: Andrey Konovalov <andreyknvl@google.com> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/usb/mixer.c12
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;