|
@@ -393,7 +393,8 @@ tproxy_laddr6(struct sk_buff *skb, const struct in6_addr *user_laddr,
|
|
|
|
|
|
rcu_read_lock();
|
|
|
indev = __in6_dev_get(skb->dev);
|
|
|
- if (indev)
|
|
|
+ if (indev) {
|
|
|
+ read_lock_bh(&indev->lock);
|
|
|
list_for_each_entry(ifa, &indev->addr_list, if_list) {
|
|
|
if (ifa->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
|
|
|
continue;
|
|
@@ -401,6 +402,8 @@ tproxy_laddr6(struct sk_buff *skb, const struct in6_addr *user_laddr,
|
|
|
laddr = &ifa->addr;
|
|
|
break;
|
|
|
}
|
|
|
+ read_unlock_bh(&indev->lock);
|
|
|
+ }
|
|
|
rcu_read_unlock();
|
|
|
|
|
|
return laddr ? laddr : daddr;
|