ipv6: route: make rtm_getroute not assume rtnl is locked
authorFlorian Westphal <fw@strlen.de>
Tue, 15 Aug 2017 14:34:42 +0000 (16:34 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Aug 2017 00:20:54 +0000 (17:20 -0700)
__dev_get_by_index assumes RTNL is held, use _rcu version instead.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/route.c

index 6793135d49dbf3f28aa59f93a0ca09aa98648e9a..60705b4d2c6248239f11737c72b3c15e2b525700 100644 (file)
@@ -3611,8 +3611,11 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
                struct net_device *dev;
                int flags = 0;
 
-               dev = __dev_get_by_index(net, iif);
+               rcu_read_lock();
+
+               dev = dev_get_by_index_rcu(net, iif);
                if (!dev) {
+                       rcu_read_unlock();
                        err = -ENODEV;
                        goto errout;
                }
@@ -3624,6 +3627,8 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 
                if (!fibmatch)
                        dst = ip6_route_input_lookup(net, dev, &fl6, flags);
+
+               rcu_read_unlock();
        } else {
                fl6.flowi6_oif = oif;