ipv6: route: enforce RCU protection in rt6_update_exception_stamp_rt() [Linux 5.0]

This Linux kernel change "ipv6: route: enforce RCU protection in rt6_update_exception_stamp_rt()" is included in the Linux 5.0 release. This change is authored by Paolo Abeni <pabeni [at] redhat.com> on Thu Feb 21 11:19:41 2019 +0100. The commit for this change in Linux stable tree is 193f368 (patch).

ipv6: route: enforce RCU protection in rt6_update_exception_stamp_rt()

We must access rt6_info->from under RCU read lock: move the
dereference under such lock, with proper annotation.

v1 -> v2:
 - avoid using multiple, racy, fetch operations for rt->from

Fixes: a68886a69180 ("net/ipv6: Make from in rt6_info rcu protected")
Signed-off-by: Paolo Abeni <[email protected]>
Reviewed-by: David Ahern <[email protected]>
Signed-off-by: David S. Miller <[email protected]>

There are 11 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 net/ipv6/route.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 964491c..2b1ed8c 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1599,15 +1599,15 @@ static int rt6_remove_exception_rt(struct rt6_info *rt)
 static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
 {
    struct rt6_exception_bucket *bucket;
-   struct fib6_info *from = rt->from;
    struct in6_addr *src_key = NULL;
    struct rt6_exception *rt6_ex;
-
-   if (!from ||
-       !(rt->rt6i_flags & RTF_CACHE))
-       return;
+   struct fib6_info *from;

    rcu_read_lock();
+   from = rcu_dereference(rt->from);
+   if (!from || !(rt->rt6i_flags & RTF_CACHE))
+       goto unlock;
+
    bucket = rcu_dereference(from->rt6i_exception_bucket);

 #ifdef CONFIG_IPV6_SUBTREES
@@ -1626,6 +1626,7 @@ static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
    if (rt6_ex)
        rt6_ex->stamp = jiffies;

+unlock:
    rcu_read_unlock();
 }

Leave a Reply

Your email address will not be published. Required fields are marked *