Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 15df03c6 authored by Eli Cooper's avatar Eli Cooper Committed by Pablo Neira Ayuso
Browse files

netfilter: ipv6: Don't preserve original oif for loopback address



Commit 508b0904 ("netfilter: ipv6: Preserve link scope traffic
original oif") made ip6_route_me_harder() keep the original oif for
link-local and multicast packets. However, it also affected packets
for the loopback address because it used rt6_need_strict().

REDIRECT rules in the OUTPUT chain rewrite the destination to loopback
address; thus its oif should not be preserved. This commit fixes the bug
that redirected local packets are being dropped. Actually the packet was
not exactly dropped; Instead it was sent out to the original oif rather
than lo. When a packet with daddr ::1 is sent to the router, it is
effectively dropped.

Fixes: 508b0904 ("netfilter: ipv6: Preserve link scope traffic original oif")
Signed-off-by: default avatarEli Cooper <elicooper@gmx.com>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent f6ac8585
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -23,9 +23,11 @@ int ip6_route_me_harder(struct net *net, struct sk_buff *skb)
	struct sock *sk = sk_to_full_sk(skb->sk);
	unsigned int hh_len;
	struct dst_entry *dst;
	int strict = (ipv6_addr_type(&iph->daddr) &
		      (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL));
	struct flowi6 fl6 = {
		.flowi6_oif = sk && sk->sk_bound_dev_if ? sk->sk_bound_dev_if :
			rt6_need_strict(&iph->daddr) ? skb_dst(skb)->dev->ifindex : 0,
			strict ? skb_dst(skb)->dev->ifindex : 0,
		.flowi6_mark = skb->mark,
		.flowi6_uid = sock_net_uid(net, sk),
		.daddr = iph->daddr,