]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ipv6: Convert inet6_ioctl() to per-netns RTNL.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 15 Jan 2025 08:06:03 +0000 (17:06 +0900)
committerJakub Kicinski <kuba@kernel.org>
Mon, 20 Jan 2025 20:16:05 +0000 (12:16 -0800)
These functions are called from inet6_ioctl() with a socket's netns
and hold RTNL.

  * SIOCSIFADDR    : addrconf_add_ifaddr()
  * SIOCDIFADDR    : addrconf_del_ifaddr()
  * SIOCSIFDSTADDR : addrconf_set_dstaddr()

Let's use rtnl_net_lock().

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115080608.28127-7-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/addrconf.c

index 4d1ec290a259c3d88ad3a5575dde896a5217441f..9c7257b28a84f3f61714e70bc72380b3fdce3521 100644 (file)
@@ -2979,11 +2979,11 @@ int addrconf_set_dstaddr(struct net *net, void __user *arg)
        if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
                return -EFAULT;
 
-       rtnl_lock();
+       rtnl_net_lock(net);
        dev = __dev_get_by_index(net, ireq.ifr6_ifindex);
        if (dev && dev->type == ARPHRD_SIT)
                err = addrconf_set_sit_dstaddr(net, dev, &ireq);
-       rtnl_unlock();
+       rtnl_net_unlock(net);
        return err;
 }
 
@@ -3181,9 +3181,9 @@ int addrconf_add_ifaddr(struct net *net, void __user *arg)
        cfg.pfx = &ireq.ifr6_addr;
        cfg.plen = ireq.ifr6_prefixlen;
 
-       rtnl_lock();
+       rtnl_net_lock(net);
        err = inet6_addr_add(net, ireq.ifr6_ifindex, &cfg, NULL);
-       rtnl_unlock();
+       rtnl_net_unlock(net);
        return err;
 }
 
@@ -3198,10 +3198,10 @@ int addrconf_del_ifaddr(struct net *net, void __user *arg)
        if (copy_from_user(&ireq, arg, sizeof(struct in6_ifreq)))
                return -EFAULT;
 
-       rtnl_lock();
+       rtnl_net_lock(net);
        err = inet6_addr_del(net, ireq.ifr6_ifindex, 0, &ireq.ifr6_addr,
                             ireq.ifr6_prefixlen, NULL);
-       rtnl_unlock();
+       rtnl_net_unlock(net);
        return err;
 }