xfrm: Fix wraparound in xfrm_policy_addr_delta()
[ Upstream commit da64ae2d35d3673233f0403b035d4c6acbf71965 ]
Use three-way comparison for address components to avoid integer
wraparound in the result of xfrm_policy_addr_delta(). This ensures
that the search trees are built and traversed correctly.
Treat IPv4 and IPv6 similarly by returning 0 when prefixlen == 0.
Prefix /0 has only one equivalence class.
Fixes: 9cf545ebd5 ("xfrm: policy: store inexact policies in a tree ordered by destination address")
Signed-off-by: Visa Hankala <visa@hankala.org>
Acked-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8ea899803b
commit
6daa52884c
@@ -287,6 +287,47 @@ check_hthresh_repeat()
|
||||
return 0
|
||||
}
|
||||
|
||||
# insert non-overlapping policies in a random order and check that
|
||||
# all of them can be fetched using the traffic selectors.
|
||||
check_random_order()
|
||||
{
|
||||
local ns=$1
|
||||
local log=$2
|
||||
|
||||
for i in $(seq 100); do
|
||||
ip -net $ns xfrm policy flush
|
||||
for j in $(seq 0 16 255 | sort -R); do
|
||||
ip -net $ns xfrm policy add dst $j.0.0.0/24 dir out priority 10 action allow
|
||||
done
|
||||
for j in $(seq 0 16 255); do
|
||||
if ! ip -net $ns xfrm policy get dst $j.0.0.0/24 dir out > /dev/null; then
|
||||
echo "FAIL: $log" 1>&2
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
for i in $(seq 100); do
|
||||
ip -net $ns xfrm policy flush
|
||||
for j in $(seq 0 16 255 | sort -R); do
|
||||
local addr=$(printf "e000:0000:%02x00::/56" $j)
|
||||
ip -net $ns xfrm policy add dst $addr dir out priority 10 action allow
|
||||
done
|
||||
for j in $(seq 0 16 255); do
|
||||
local addr=$(printf "e000:0000:%02x00::/56" $j)
|
||||
if ! ip -net $ns xfrm policy get dst $addr dir out > /dev/null; then
|
||||
echo "FAIL: $log" 1>&2
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
ip -net $ns xfrm policy flush
|
||||
|
||||
echo "PASS: $log"
|
||||
return 0
|
||||
}
|
||||
|
||||
#check for needed privileges
|
||||
if [ "$(id -u)" -ne 0 ];then
|
||||
echo "SKIP: Need root privileges"
|
||||
@@ -438,6 +479,8 @@ check_exceptions "exceptions and block policies after htresh change to normal"
|
||||
|
||||
check_hthresh_repeat "policies with repeated htresh change"
|
||||
|
||||
check_random_order ns3 "policies inserted in random order"
|
||||
|
||||
for i in 1 2 3 4;do ip netns del ns$i;done
|
||||
|
||||
exit $ret
|
||||
|
||||
Reference in New Issue
Block a user