thunderbolt: Check that both ports are reachable when allocating path
authorMika Westerberg <mika.westerberg@linux.intel.com>
Sun, 17 May 2020 07:44:31 +0000 (10:44 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Mon, 22 Jun 2020 16:58:19 +0000 (19:58 +0300)
Add sanity check that given src and dst ports are reachable through path
walk before allocating a path. If they are not then bail out early.

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

index 77abb1fa80c0edfc8b356115960aa4c0b37964b6..854ff34121614d9edf94da77f0026f085189380d 100644 (file)
@@ -229,7 +229,7 @@ struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
                              struct tb_port *dst, int dst_hopid, int link_nr,
                              const char *name)
 {
-       struct tb_port *in_port, *out_port;
+       struct tb_port *in_port, *out_port, *first_port, *last_port;
        int in_hopid, out_hopid;
        struct tb_path *path;
        size_t num_hops;
@@ -239,9 +239,20 @@ struct tb_path *tb_path_alloc(struct tb *tb, struct tb_port *src, int src_hopid,
        if (!path)
                return NULL;
 
+       first_port = last_port = NULL;
        i = 0;
-       tb_for_each_port_on_path(src, dst, in_port)
+       tb_for_each_port_on_path(src, dst, in_port) {
+               if (!first_port)
+                       first_port = in_port;
+               last_port = in_port;
                i++;
+       }
+
+       /* Check that src and dst are reachable */
+       if (first_port != src || last_port != dst) {
+               kfree(path);
+               return NULL;
+       }
 
        /* Each hop takes two ports */
        num_hops = i / 2;