@@ -3014,7 +3014,7 @@ static int inet6_addr_add(struct net *net, struct net_device *dev,
3014
3014
struct inet6_ifaddr * ifp ;
3015
3015
struct inet6_dev * idev ;
3016
3016
3017
- ASSERT_RTNL ( );
3017
+ ASSERT_RTNL_NET ( net );
3018
3018
3019
3019
if (cfg -> plen > 128 ) {
3020
3020
NL_SET_ERR_MSG_MOD (extack , "Invalid prefix length" );
@@ -4849,7 +4849,7 @@ static int inet6_addr_modify(struct net *net, struct inet6_ifaddr *ifp,
4849
4849
bool new_peer = false;
4850
4850
bool had_prefixroute ;
4851
4851
4852
- ASSERT_RTNL ( );
4852
+ ASSERT_RTNL_NET ( net );
4853
4853
4854
4854
if (cfg -> ifa_flags & IFA_F_MANAGETEMPADDR &&
4855
4855
(ifp -> flags & IFA_F_TEMPORARY || ifp -> prefix_len != 64 ))
@@ -5016,23 +5016,29 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
5016
5016
}
5017
5017
}
5018
5018
5019
+ rtnl_net_lock (net );
5020
+
5019
5021
dev = __dev_get_by_index (net , ifm -> ifa_index );
5020
5022
if (!dev ) {
5021
5023
NL_SET_ERR_MSG_MOD (extack , "Unable to find the interface" );
5022
- return - ENODEV ;
5024
+ err = - ENODEV ;
5025
+ goto unlock ;
5023
5026
}
5024
5027
5025
5028
idev = ipv6_find_idev (dev );
5026
- if (IS_ERR (idev ))
5027
- return PTR_ERR (idev );
5029
+ if (IS_ERR (idev )) {
5030
+ err = PTR_ERR (idev );
5031
+ goto unlock ;
5032
+ }
5028
5033
5029
5034
if (!ipv6_allow_optimistic_dad (net , idev ))
5030
5035
cfg .ifa_flags &= ~IFA_F_OPTIMISTIC ;
5031
5036
5032
5037
if (cfg .ifa_flags & IFA_F_NODAD &&
5033
5038
cfg .ifa_flags & IFA_F_OPTIMISTIC ) {
5034
5039
NL_SET_ERR_MSG (extack , "IFA_F_NODAD and IFA_F_OPTIMISTIC are mutually exclusive" );
5035
- return - EINVAL ;
5040
+ err = - EINVAL ;
5041
+ goto unlock ;
5036
5042
}
5037
5043
5038
5044
ifa = ipv6_get_ifaddr (net , cfg .pfx , dev , 1 );
@@ -5041,7 +5047,8 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
5041
5047
* It would be best to check for !NLM_F_CREATE here but
5042
5048
* userspace already relies on not having to provide this.
5043
5049
*/
5044
- return inet6_addr_add (net , dev , & cfg , expires , flags , extack );
5050
+ err = inet6_addr_add (net , dev , & cfg , expires , flags , extack );
5051
+ goto unlock ;
5045
5052
}
5046
5053
5047
5054
if (nlh -> nlmsg_flags & NLM_F_EXCL ||
@@ -5053,6 +5060,8 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
5053
5060
}
5054
5061
5055
5062
in6_ifa_put (ifa );
5063
+ unlock :
5064
+ rtnl_net_unlock (net );
5056
5065
5057
5066
return err ;
5058
5067
}
@@ -7393,7 +7402,7 @@ static const struct rtnl_msg_handler addrconf_rtnl_msg_handlers[] __initconst_or
7393
7402
{.owner = THIS_MODULE , .protocol = PF_INET6 , .msgtype = RTM_GETLINK ,
7394
7403
.dumpit = inet6_dump_ifinfo , .flags = RTNL_FLAG_DUMP_UNLOCKED },
7395
7404
{.owner = THIS_MODULE , .protocol = PF_INET6 , .msgtype = RTM_NEWADDR ,
7396
- .doit = inet6_rtm_newaddr },
7405
+ .doit = inet6_rtm_newaddr , . flags = RTNL_FLAG_DOIT_PERNET },
7397
7406
{.owner = THIS_MODULE , .protocol = PF_INET6 , .msgtype = RTM_DELADDR ,
7398
7407
.doit = inet6_rtm_deladdr },
7399
7408
{.owner = THIS_MODULE , .protocol = PF_INET6 , .msgtype = RTM_GETADDR ,
0 commit comments