]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ipv6: Convert inet6_rtm_deladdr() to per-netns RTNL.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Wed, 15 Jan 2025 08:06:08 +0000 (17:06 +0900)
committerJakub Kicinski <kuba@kernel.org>
Mon, 20 Jan 2025 20:16:06 +0000 (12:16 -0800)
Let's register inet6_rtm_deladdr() with RTNL_FLAG_DOIT_PERNET and
hold rtnl_net_lock() before inet6_addr_del().

Now that inet6_addr_del() is always called under per-netns RTNL.

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

index b848e4038d2eff7afcdf713bf1cd0fed111e89de..ac8cc10765360fe5a8c61d4654308b7559a38c09 100644 (file)
@@ -3096,7 +3096,7 @@ static int inet6_addr_del(struct net *net, int ifindex, u32 ifa_flags,
                return -ENODEV;
        }
 
-       idev = __in6_dev_get(dev);
+       idev = __in6_dev_get_rtnl_net(dev);
        if (!idev) {
                NL_SET_ERR_MSG_MOD(extack, "IPv6 is disabled on this device");
                return -ENXIO;
@@ -4792,8 +4792,12 @@ inet6_rtm_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh,
        /* We ignore other flags so far. */
        ifa_flags &= IFA_F_MANAGETEMPADDR;
 
-       return inet6_addr_del(net, ifm->ifa_index, ifa_flags, pfx,
-                             ifm->ifa_prefixlen, extack);
+       rtnl_net_lock(net);
+       err = inet6_addr_del(net, ifm->ifa_index, ifa_flags, pfx,
+                            ifm->ifa_prefixlen, extack);
+       rtnl_net_unlock(net);
+
+       return err;
 }
 
 static int modify_prefix_route(struct net *net, struct inet6_ifaddr *ifp,
@@ -7404,7 +7408,7 @@ static const struct rtnl_msg_handler addrconf_rtnl_msg_handlers[] __initconst_or
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_NEWADDR,
         .doit = inet6_rtm_newaddr, .flags = RTNL_FLAG_DOIT_PERNET},
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_DELADDR,
-        .doit = inet6_rtm_deladdr},
+        .doit = inet6_rtm_deladdr, .flags = RTNL_FLAG_DOIT_PERNET},
        {.owner = THIS_MODULE, .protocol = PF_INET6, .msgtype = RTM_GETADDR,
         .doit = inet6_rtm_getaddr, .dumpit = inet6_dump_ifaddr,
         .flags = RTNL_FLAG_DOIT_UNLOCKED | RTNL_FLAG_DUMP_UNLOCKED},