net: mctp: make key lookups match the ANY address on either local or peer
authorJeremy Kerr <jk@codeconstruct.com.au>
Mon, 19 Feb 2024 09:51:48 +0000 (17:51 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 22 Feb 2024 12:32:54 +0000 (13:32 +0100)
We may have an ANY address in either the local or peer address of a
sk_key, and may want to match on an incoming daddr or saddr being ANY.

Do this by altering the conflicting-tag lookup to also accept ANY as
the local/peer address.

We don't want mctp_address_matches to match on the requested EID being
ANY, as that is a specific lookup case on packet input.

Reported-by: Eric Chuang <echuang@google.com>
Reported-by: Anthony <anthonyhkf@google.com>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/mctp/route.c

index b4ad47bb0da5bb77580c07e5d96f00b3c3fab7a8..0c2ed75a9e28275aed06f2519ef6d59d8464dabd 100644 (file)
@@ -113,7 +113,7 @@ static bool mctp_key_match(struct mctp_sk_key *key, mctp_eid_t local,
        if (!mctp_address_matches(key->local_addr, local))
                return false;
 
-       if (key->peer_addr != peer)
+       if (!mctp_address_matches(key->peer_addr, peer))
                return false;
 
        if (key->tag != tag)
@@ -672,8 +672,16 @@ struct mctp_sk_key *mctp_alloc_local_tag(struct mctp_sock *msk,
                if (tmp->tag & MCTP_HDR_FLAG_TO)
                        continue;
 
-               if (!(mctp_address_matches(tmp->peer_addr, peer) &&
-                     mctp_address_matches(tmp->local_addr, local)))
+               /* Since we're avoiding conflicting entries, match peer and
+                * local addresses, including with a wildcard on ANY. See
+                * 'A note on key allocations' for background.
+                */
+               if (peer != MCTP_ADDR_ANY &&
+                   !mctp_address_matches(tmp->peer_addr, peer))
+                       continue;
+
+               if (local != MCTP_ADDR_ANY &&
+                   !mctp_address_matches(tmp->local_addr, local))
                        continue;
 
                spin_lock(&tmp->lock);