Patch "mctp: perform route lookups under a RCU read-side lock" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mctp: perform route lookups under a RCU read-side lock

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mctp-perform-route-lookups-under-a-rcu-read-side-loc.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 8fc6f7ac730d22db2aac70b2311b67f9a44c9764
Author: Jeremy Kerr <jk@xxxxxxxxxxxxxxxxxxxx>
Date:   Mon Oct 9 15:56:45 2023 +0800

    mctp: perform route lookups under a RCU read-side lock
    
    [ Upstream commit 5093bbfc10ab6636b32728e35813cbd79feb063c ]
    
    Our current route lookups (mctp_route_lookup and mctp_route_lookup_null)
    traverse the net's route list without the RCU read lock held. This means
    the route lookup is subject to preemption, resulting in an potential
    grace period expiry, and so an eventual kfree() while we still have the
    route pointer.
    
    Add the proper read-side critical section locks around the route
    lookups, preventing premption and a possible parallel kfree.
    
    The remaining net->mctp.routes accesses are already under a
    rcu_read_lock, or protected by the RTNL for updates.
    
    Based on an analysis from Sili Luo <rootlab@xxxxxxxxxx>, where
    introducing a delay in the route lookup could cause a UAF on
    simultaneous sendmsg() and route deletion.
    
    Reported-by: Sili Luo <rootlab@xxxxxxxxxx>
    Fixes: 889b7da23abf ("mctp: Add initial routing framework")
    Cc: stable@xxxxxxxxxxxxxxx
    Signed-off-by: Jeremy Kerr <jk@xxxxxxxxxxxxxxxxxxxx>
    Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/29c4b0e67dc1bf3571df3982de87df90cae9b631.1696837310.git.jk@xxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/mctp/route.c b/net/mctp/route.c
index 859f57fd3871f..5ef6b3b0a3d99 100644
--- a/net/mctp/route.c
+++ b/net/mctp/route.c
@@ -549,6 +549,8 @@ struct mctp_route *mctp_route_lookup(struct net *net, unsigned int dnet,
 {
 	struct mctp_route *tmp, *rt = NULL;
 
+	rcu_read_lock();
+
 	list_for_each_entry_rcu(tmp, &net->mctp.routes, list) {
 		/* TODO: add metrics */
 		if (mctp_rt_match_eid(tmp, dnet, daddr)) {
@@ -559,21 +561,29 @@ struct mctp_route *mctp_route_lookup(struct net *net, unsigned int dnet,
 		}
 	}
 
+	rcu_read_unlock();
+
 	return rt;
 }
 
 static struct mctp_route *mctp_route_lookup_null(struct net *net,
 						 struct net_device *dev)
 {
-	struct mctp_route *rt;
+	struct mctp_route *tmp, *rt = NULL;
 
-	list_for_each_entry_rcu(rt, &net->mctp.routes, list) {
-		if (rt->dev->dev == dev && rt->type == RTN_LOCAL &&
-		    refcount_inc_not_zero(&rt->refs))
-			return rt;
+	rcu_read_lock();
+
+	list_for_each_entry_rcu(tmp, &net->mctp.routes, list) {
+		if (tmp->dev->dev == dev && tmp->type == RTN_LOCAL &&
+		    refcount_inc_not_zero(&tmp->refs)) {
+			rt = tmp;
+			break;
+		}
 	}
 
-	return NULL;
+	rcu_read_unlock();
+
+	return rt;
 }
 
 /* sends a skb to rt and releases the route. */



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux