thunderbolt: Handle incomplete PCIe/USB3 paths correctly in discovery
authorMika Westerberg <mika.westerberg@linux.intel.com>
Fri, 8 May 2020 08:55:03 +0000 (11:55 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 22 Jun 2020 16:58:20 +0000 (19:58 +0300)
If the path is not complete when we do discovery the number of hops may
be less than with the full path. As an example when this can happen is
that user unloads the driver, disconnects the topology, and loads the
driver back. If there is PCIe or USB3 tunnel involved this may happen.

Take this into account in tb_pcie_init_path() and tb_usb3_init_path()
and prevent potential access over array limits.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/tunnel.c

index c144ca9..5bdb8b1 100644 (file)
@@ -124,8 +124,9 @@ static void tb_pci_init_path(struct tb_path *path)
        path->drop_packages = 0;
        path->nfc_credits = 0;
        path->hops[0].initial_credits = 7;
-       path->hops[1].initial_credits =
-               tb_initial_credits(path->hops[1].in_port->sw);
+       if (path->path_length > 1)
+               path->hops[1].initial_credits =
+                       tb_initial_credits(path->hops[1].in_port->sw);
 }
 
 /**
@@ -879,8 +880,9 @@ static void tb_usb3_init_path(struct tb_path *path)
        path->drop_packages = 0;
        path->nfc_credits = 0;
        path->hops[0].initial_credits = 7;
-       path->hops[1].initial_credits =
-               tb_initial_credits(path->hops[1].in_port->sw);
+       if (path->path_length > 1)
+               path->hops[1].initial_credits =
+                       tb_initial_credits(path->hops[1].in_port->sw);
 }
 
 /**