aboutsummaryrefslogtreecommitdiffstats
path: root/net/mctp
diff options
context:
space:
mode:
authorJeremy Kerr <jk@codeconstruct.com.au>2024-02-19 17:51:48 +0800
committerPaolo Abeni <pabeni@redhat.com>2024-02-22 13:32:54 +0100
commitfc944ecc4f1a287882d90441360a0ba61d45fd8b (patch)
tree1ec2550d76dd69e4587d12d33be856aaee0a9df1 /net/mctp
parentaee6479a458e2c5027e558cfe26c60c37f8efc80 (diff)
downloadlinux-fc944ecc4f1a287882d90441360a0ba61d45fd8b.tar.gz
net: mctp: make key lookups match the ANY address on either local or peer
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>
Diffstat (limited to 'net/mctp')
-rw-r--r--net/mctp/route.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/net/mctp/route.c b/net/mctp/route.c
index b4ad47bb0da5bb..0c2ed75a9e2827 100644
--- a/net/mctp/route.c
+++ b/net/mctp/route.c
@@ -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);