Skip to content

Commit ca7a03c

Browse files
zx2c4davem330
authored andcommitted
ipv6: do not free rt if FIB_LOOKUP_NOREF is set on suppress rule
Commit 7d9e5f4 removed references from certain dsts, but accounting for this never translated down into the fib6 suppression code. This bug was triggered by WireGuard users who use wg-quick(8), which uses the "suppress-prefix" directive to ip-rule(8) for routing all of their internet traffic without routing loops. The test case added here causes the reference underflow by causing packets to evaluate a suppress rule. Fixes: 7d9e5f4 ("ipv6: convert major tx path to use RT6_LOOKUP_F_DST_NOREF") Signed-off-by: Jason A. Donenfeld <[email protected]> Acked-by: Wei Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ea8564c commit ca7a03c

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

net/ipv6/fib6_rules.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,8 @@ static bool fib6_rule_suppress(struct fib_rule *rule, struct fib_lookup_arg *arg
287287
return false;
288288

289289
suppress_route:
290-
ip6_rt_put(rt);
290+
if (!(arg->flags & FIB_LOOKUP_NOREF))
291+
ip6_rt_put(rt);
291292
return true;
292293
}
293294

tools/testing/selftests/net/fib_tests.sh

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ ret=0
99
ksft_skip=4
1010

1111
# all tests in this script. Can be overridden with -t option
12-
TESTS="unregister down carrier nexthop ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter"
12+
TESTS="unregister down carrier nexthop suppress ipv6_rt ipv4_rt ipv6_addr_metric ipv4_addr_metric ipv6_route_metrics ipv4_route_metrics ipv4_route_v6_gw rp_filter"
1313

1414
VERBOSE=0
1515
PAUSE_ON_FAIL=no
@@ -616,6 +616,20 @@ fib_nexthop_test()
616616
cleanup
617617
}
618618

619+
fib_suppress_test()
620+
{
621+
$IP link add dummy1 type dummy
622+
$IP link set dummy1 up
623+
$IP -6 route add default dev dummy1
624+
$IP -6 rule add table main suppress_prefixlength 0
625+
ping -f -c 1000 -W 1 1234::1 || true
626+
$IP -6 rule del table main suppress_prefixlength 0
627+
$IP link del dummy1
628+
629+
# If we got here without crashing, we're good.
630+
return 0
631+
}
632+
619633
################################################################################
620634
# Tests on route add and replace
621635

@@ -1593,6 +1607,7 @@ do
15931607
fib_carrier_test|carrier) fib_carrier_test;;
15941608
fib_rp_filter_test|rp_filter) fib_rp_filter_test;;
15951609
fib_nexthop_test|nexthop) fib_nexthop_test;;
1610+
fib_suppress_test|suppress) fib_suppress_test;;
15961611
ipv6_route_test|ipv6_rt) ipv6_route_test;;
15971612
ipv4_route_test|ipv4_rt) ipv4_route_test;;
15981613
ipv6_addr_metric) ipv6_addr_metric_test;;

0 commit comments

Comments
 (0)