[IPV6]: ipv6_add_addr should install dstentry earlier
ipv6_add_addr allocates a struct inet6_ifaddr and a dstentry, but it doesn't install the dstentry in ifa->rt until after it releases the addrconf_hash_lock. This means other CPUs will be able to see the new address while it hasn't been initialized completely yet. One possible fix would be to grab the ifp->lock spinlock when creating the address struct; a simpler fix is to just move the assignment. Acked-by: jbeulich@novell.com Acked-by: okir@suse.de Acked-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
fab2caf62e
Коммит
57f5f544f5
|
@ -578,6 +578,8 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
|
|||
ifa->flags = flags | IFA_F_TENTATIVE;
|
||||
ifa->cstamp = ifa->tstamp = jiffies;
|
||||
|
||||
ifa->rt = rt;
|
||||
|
||||
ifa->idev = idev;
|
||||
in6_dev_hold(idev);
|
||||
/* For caller */
|
||||
|
@ -603,8 +605,6 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
|
|||
}
|
||||
#endif
|
||||
|
||||
ifa->rt = rt;
|
||||
|
||||
in6_ifa_hold(ifa);
|
||||
write_unlock(&idev->lock);
|
||||
out2:
|
||||
|
|
Загрузка…
Ссылка в новой задаче