Skip to content

Commit 0c7930e

Browse files
Liping Zhangummakynes
authored andcommitted
netfilter: make it safer during the inet6_dev->addr_list traversal
inet6_dev->addr_list is protected by inet6_dev->lock, so only using rcu_read_lock is not enough, we should acquire read_lock_bh(&idev->lock) before the inet6_dev->addr_list traversal. Signed-off-by: Liping Zhang <[email protected]> Signed-off-by: Pablo Neira Ayuso <[email protected]>
1 parent 3173d5b commit 0c7930e

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

net/netfilter/nf_nat_redirect.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,13 @@ nf_nat_redirect_ipv6(struct sk_buff *skb, const struct nf_nat_range *range,
101101
rcu_read_lock();
102102
idev = __in6_dev_get(skb->dev);
103103
if (idev != NULL) {
104+
read_lock_bh(&idev->lock);
104105
list_for_each_entry(ifa, &idev->addr_list, if_list) {
105106
newdst = ifa->addr;
106107
addr = true;
107108
break;
108109
}
110+
read_unlock_bh(&idev->lock);
109111
}
110112
rcu_read_unlock();
111113

net/netfilter/xt_TPROXY.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,14 +393,17 @@ tproxy_laddr6(struct sk_buff *skb, const struct in6_addr *user_laddr,
393393

394394
rcu_read_lock();
395395
indev = __in6_dev_get(skb->dev);
396-
if (indev)
396+
if (indev) {
397+
read_lock_bh(&indev->lock);
397398
list_for_each_entry(ifa, &indev->addr_list, if_list) {
398399
if (ifa->flags & (IFA_F_TENTATIVE | IFA_F_DEPRECATED))
399400
continue;
400401

401402
laddr = &ifa->addr;
402403
break;
403404
}
405+
read_unlock_bh(&indev->lock);
406+
}
404407
rcu_read_unlock();
405408

406409
return laddr ? laddr : daddr;

0 commit comments

Comments
 (0)