]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
thunderbolt: Bound the DROM dual link port number before indexing sw->ports
authorBryam Vargas <hexlabsecurity@proton.me>
Thu, 25 Jun 2026 11:54:09 +0000 (06:54 -0500)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 27 Jul 2026 09:58:54 +0000 (11:58 +0200)
tb_drom_parse_entry_port() validates the device-supplied header->index
against sw->config.max_port_number before indexing sw->ports[], but the
sibling field entry->dual_link_port_nr -- a 6-bit value also read from
the DROM -- indexes the same array with no such check. A malicious or
malformed Thunderbolt device can set dual_link_port_nr beyond the
allocated sw->ports[] (max_port_number + 1 entries), producing an
out-of-bounds tb_port pointer that is stored and later dereferenced.

Reject a port entry whose dual_link_port_nr exceeds max_port_number,
the same bound already applied to header->index.

Fixes: cd22e73bdf5e ("thunderbolt: Read port configuration from eeprom.")
Cc: stable@vger.kernel.org
Signed-off-by: Bryam Vargas <hexlabsecurity@proton.me>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/eeprom.c

index 5681c17f82ecc130a642d9eaf0c23533a1b0e634..2a13fa6888ba132d550544b3407ee5df08dfbdc4 100644 (file)
@@ -394,9 +394,16 @@ static int tb_drom_parse_entry_port(struct tb_switch *sw,
                        return -EIO;
                }
                port->link_nr = entry->link_nr;
-               if (entry->has_dual_link_port)
+               if (entry->has_dual_link_port) {
+                       if (entry->dual_link_port_nr > sw->config.max_port_number) {
+                               tb_sw_warn(sw,
+                                       "port entry has invalid dual link port number %u\n",
+                                       entry->dual_link_port_nr);
+                               return -EIO;
+                       }
                        port->dual_link_port =
                                &port->sw->ports[entry->dual_link_port_nr];
+               }
        }
        return 0;
 }