Merge branch 'ipv6-route-rcu'
Paolo Abeni says: ==================== ipv6: route: enforce RCU protection for fib6_info->from This series addresses a couple of RCU left-over dating back to rt6_info->from conversion to RCU v1 -> v2: - fix a possible race in patch 1 ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
64cc41e62a
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -2742,20 +2743,24 @@ static int ip6_route_check_nh_onlink(struct net *net,
|
|||
u32 tbid = l3mdev_fib_table(dev) ? : RT_TABLE_MAIN;
|
||||
const struct in6_addr *gw_addr = &cfg->fc_gateway;
|
||||
u32 flags = RTF_LOCAL | RTF_ANYCAST | RTF_REJECT;
|
||||
struct fib6_info *from;
|
||||
struct rt6_info *grt;
|
||||
int err;
|
||||
|
||||
err = 0;
|
||||
grt = ip6_nh_lookup_table(net, cfg, gw_addr, tbid, 0);
|
||||
if (grt) {
|
||||
rcu_read_lock();
|
||||
from = rcu_dereference(grt->from);
|
||||
if (!grt->dst.error &&
|
||||
/* ignore match if it is the default route */
|
||||
grt->from && !ipv6_addr_any(&grt->from->fib6_dst.addr) &&
|
||||
from && !ipv6_addr_any(&from->fib6_dst.addr) &&
|
||||
(grt->rt6i_flags & flags || dev != grt->dst.dev)) {
|
||||
NL_SET_ERR_MSG(extack,
|
||||
"Nexthop has invalid gateway or device mismatch");
|
||||
err = -EINVAL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
ip6_rt_put(grt);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче