mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
ipv4: Fix off-by-one in route dump counter without netlink strict checking
In commitee28906fd7
("ipv4: Dump route exceptions if requested") I added a counter of per-node dumped routes (including actual routes and exceptions), analogous to the existing counter for dumped nodes. Dumping exceptions means we need to also keep track of how many routes are dumped for each node: this would be just one route per node, without exceptions. When netlink strict checking is not enabled, we dump both routes and exceptions at the same time: the RTM_F_CLONED flag is not used as a filter. In this case, the per-node counter 'i_fa' is incremented by one to track the single dumped route, then also incremented by one for each exception dumped, and then stored as netlink callback argument as skip counter, 's_fa', to be used when a partial dump operation restarts. The per-node counter needs to be increased by one also when we skip a route (exception) due to a previous non-zero skip counter, because it needs to match the existing skip counter, if we are dumping both routes and exceptions. I missed this, and only incremented the counter, for regular routes, if the previous skip counter was zero. This means that, in case of a mixed dump, partial dump operations after the first one will start with a mismatching skip counter value, one less than expected. This means in turn that the first exception for a given node is skipped every time a partial dump operation restarts, if netlink strict checking is not enabled (iproute < 5.0). It turns out I didn't repeat the test in its final version, commitde755a8513
("selftests: pmtu: Introduce list_flush_ipv4_exception test case"), which also counts the number of route exceptions returned, with iproute2 versions < 5.0 -- I was instead using the equivalent of the IPv6 test as it was before commitb964641e99
("selftests: pmtu: Make list_flush_ipv6_exception test more demanding"). Always increment the per-node counter by one if we previously dumped a regular route, so that it matches the current skip counter. Fixes:ee28906fd7
("ipv4: Dump route exceptions if requested") Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cce581a0c3
commit
885b8b4dbb
@ -2126,14 +2126,20 @@ static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb,
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (filter->dump_routes && !s_fa) {
|
||||
err = fib_dump_info(skb, NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq, RTM_NEWROUTE,
|
||||
tb->tb_id, fa->fa_type,
|
||||
xkey, KEYLENGTH - fa->fa_slen,
|
||||
fa->fa_tos, fi, flags);
|
||||
if (err < 0)
|
||||
goto stop;
|
||||
if (filter->dump_routes) {
|
||||
if (!s_fa) {
|
||||
err = fib_dump_info(skb,
|
||||
NETLINK_CB(cb->skb).portid,
|
||||
cb->nlh->nlmsg_seq,
|
||||
RTM_NEWROUTE,
|
||||
tb->tb_id, fa->fa_type,
|
||||
xkey,
|
||||
KEYLENGTH - fa->fa_slen,
|
||||
fa->fa_tos, fi, flags);
|
||||
if (err < 0)
|
||||
goto stop;
|
||||
}
|
||||
|
||||
i_fa++;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user