diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-09-21 16:58:48 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-09-21 17:01:38 +0200 |
commit | 2e1c42391ff2556387b3cb6308b24f6f65619feb (patch) | |
tree | de17bf75f6f81fb1d2d14748ede49e7d3f3c2f88 /drivers/usb | |
parent | 60e70ecd7ae0f09ed07699517071eacb01c26d13 (diff) | |
download | linux-stable-2e1c42391ff2556387b3cb6308b24f6f65619feb.tar.gz linux-stable-2e1c42391ff2556387b3cb6308b24f6f65619feb.tar.bz2 linux-stable-2e1c42391ff2556387b3cb6308b24f6f65619feb.zip |
USB: core: harden cdc_parse_cdc_header
Andrey Konovalov reported a possible out-of-bounds problem for the
cdc_parse_cdc_header function. He writes:
It looks like cdc_parse_cdc_header() doesn't validate buflen
before accessing buffer[1], buffer[2] and so on. The only check
present is while (buflen > 0).
So fix this issue up by properly validating the buffer length matches
what the descriptor says it is.
Reported-by: Andrey Konovalov <andreyknvl@google.com>
Tested-by: Andrey Konovalov <andreyknvl@google.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/core/message.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 4c38ea41ae96..371a07d874a3 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -2069,6 +2069,10 @@ int cdc_parse_cdc_header(struct usb_cdc_parsed_header *hdr, elength = 1; goto next_desc; } + if ((buflen < elength) || (elength < 3)) { + dev_err(&intf->dev, "invalid descriptor buffer length\n"); + break; + } if (buffer[1] != USB_DT_CS_INTERFACE) { dev_err(&intf->dev, "skipping garbage\n"); goto next_desc; |