]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
USB: serial: io_ti: fix heap overflow in get_manuf_info()
authorAdrian Korwel <adriank20047@gmail.com>
Mon, 25 May 2026 14:58:31 +0000 (09:58 -0500)
committerJohan Hovold <johan@kernel.org>
Tue, 2 Jun 2026 10:08:52 +0000 (12:08 +0200)
get_manuf_info() reads le16_to_cpu(rom_desc->Size) bytes from the
device I2C EEPROM into a buffer allocated with kmalloc_obj(), which
is sizeof(struct edge_ti_manuf_descriptor) = 10 bytes.

The Size field comes from the device and is only validated (in
check_i2c_image()) to make sure the descriptor fits within
TI_MAX_I2C_SIZE (16384 bytes), not against the destination buffer size.
A malicious USB device can therefore set Size to any value up to 16377,
causing a heap overflow of up to 16367 bytes when plugged into a host
running this driver.

valid_csum() is called after read_rom() and also iterates
buffer[0..Size-1], compounding the out-of-bounds access.

Fix by rejecting descriptors with unexpected length before calling
read_rom().

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Cc: stable@vger.kernel.org
Signed-off-by: Adrian Korwel <adriank20047@gmail.com>
[ johan: amend commit message; also check for short descriptors ]
Signed-off-by: Johan Hovold <johan@kernel.org>
drivers/usb/serial/io_ti.c

index cb55370e036f7abe0246c3e211bbe77dfd24e66c..6e0d4c38911b5952294fcb79e17f3a87444f7d5e 100644 (file)
@@ -773,6 +773,12 @@ static int get_manuf_info(struct edgeport_serial *serial, u8 *buffer)
        }
 
        /* Read the descriptor data */
+       if (le16_to_cpu(rom_desc->Size) != sizeof(struct edge_ti_manuf_descriptor)) {
+               dev_err(dev, "unexpected Edge descriptor length: %u\n",
+                       le16_to_cpu(rom_desc->Size));
+               status = -EINVAL;
+               goto exit;
+       }
        status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc),
                                        le16_to_cpu(rom_desc->Size), buffer);
        if (status)