Skip to content

Commit cceac92

Browse files
committed
Merge tag 'nf-23-05-10' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf
Pablo Neira Ayuso says: ==================== Netfilter updates for net The following patchset contains Netfilter fixes for net: 1) Fix UAF when releasing netnamespace, from Florian Westphal. 2) Fix possible BUG_ON when nf_conntrack is enabled with enable_hooks, from Florian Westphal. 3) Fixes for nft_flowtable.sh selftest, from Boris Sukholitko. 4) Extend nft_flowtable.sh selftest to cover integration with ingress/egress hooks, from Florian Westphal. * tag 'nf-23-05-10' of git://git.kernel.org/pub/scm/linux/kernel/git/netfilter/nf: selftests: nft_flowtable.sh: check ingress/egress chain too selftests: nft_flowtable.sh: monitor result file sizes selftests: nft_flowtable.sh: wait for specific nc pids selftests: nft_flowtable.sh: no need for ps -x option selftests: nft_flowtable.sh: use /proc for pid checking netfilter: conntrack: fix possible bug_on with enable_hooks=1 netfilter: nf_tables: always release netdev hooks from notifier ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 33dcee9 + 3acf8f6 commit cceac92

File tree

4 files changed

+151
-12
lines changed

4 files changed

+151
-12
lines changed

net/netfilter/core.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -711,9 +711,11 @@ void nf_conntrack_destroy(struct nf_conntrack *nfct)
711711

712712
rcu_read_lock();
713713
ct_hook = rcu_dereference(nf_ct_hook);
714-
BUG_ON(ct_hook == NULL);
715-
ct_hook->destroy(nfct);
714+
if (ct_hook)
715+
ct_hook->destroy(nfct);
716716
rcu_read_unlock();
717+
718+
WARN_ON(!ct_hook);
717719
}
718720
EXPORT_SYMBOL(nf_conntrack_destroy);
719721

net/netfilter/nf_conntrack_standalone.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1218,11 +1218,12 @@ static int __init nf_conntrack_standalone_init(void)
12181218
nf_conntrack_htable_size_user = nf_conntrack_htable_size;
12191219
#endif
12201220

1221+
nf_conntrack_init_end();
1222+
12211223
ret = register_pernet_subsys(&nf_conntrack_net_ops);
12221224
if (ret < 0)
12231225
goto out_pernet;
12241226

1225-
nf_conntrack_init_end();
12261227
return 0;
12271228

12281229
out_pernet:

net/netfilter/nft_chain_filter.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,12 @@ static void nft_netdev_event(unsigned long event, struct net_device *dev,
344344
return;
345345
}
346346

347+
/* UNREGISTER events are also happening on netns exit.
348+
*
349+
* Although nf_tables core releases all tables/chains, only this event
350+
* handler provides guarantee that hook->ops.dev is still accessible,
351+
* so we cannot skip exiting net namespaces.
352+
*/
347353
__nft_release_basechain(ctx);
348354
}
349355

@@ -362,9 +368,6 @@ static int nf_tables_netdev_event(struct notifier_block *this,
362368
event != NETDEV_CHANGENAME)
363369
return NOTIFY_DONE;
364370

365-
if (!check_net(ctx.net))
366-
return NOTIFY_DONE;
367-
368371
nft_net = nft_pernet(ctx.net);
369372
mutex_lock(&nft_net->commit_mutex);
370373
list_for_each_entry(table, &nft_net->tables, list) {

tools/testing/selftests/netfilter/nft_flowtable.sh

Lines changed: 139 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,26 @@ if [ $? -ne 0 ]; then
188188
exit $ksft_skip
189189
fi
190190

191+
ip netns exec $ns2 nft -f - <<EOF
192+
table inet filter {
193+
counter ip4dscp0 { }
194+
counter ip4dscp3 { }
195+
196+
chain input {
197+
type filter hook input priority 0; policy accept;
198+
meta l4proto tcp goto {
199+
ip dscp cs3 counter name ip4dscp3 accept
200+
ip dscp 0 counter name ip4dscp0 accept
201+
}
202+
}
203+
}
204+
EOF
205+
206+
if [ $? -ne 0 ]; then
207+
echo "SKIP: Could not load nft ruleset"
208+
exit $ksft_skip
209+
fi
210+
191211
# test basic connectivity
192212
if ! ip netns exec $ns1 ping -c 1 -q 10.0.2.99 > /dev/null; then
193213
echo "ERROR: $ns1 cannot reach ns2" 1>&2
@@ -255,6 +275,60 @@ check_counters()
255275
fi
256276
}
257277

278+
check_dscp()
279+
{
280+
local what=$1
281+
local ok=1
282+
283+
local counter=$(ip netns exec $ns2 nft reset counter inet filter ip4dscp3 | grep packets)
284+
285+
local pc4=${counter%*bytes*}
286+
local pc4=${pc4#*packets}
287+
288+
local counter=$(ip netns exec $ns2 nft reset counter inet filter ip4dscp0 | grep packets)
289+
local pc4z=${counter%*bytes*}
290+
local pc4z=${pc4z#*packets}
291+
292+
case "$what" in
293+
"dscp_none")
294+
if [ $pc4 -gt 0 ] || [ $pc4z -eq 0 ]; then
295+
echo "FAIL: dscp counters do not match, expected dscp3 == 0, dscp0 > 0, but got $pc4,$pc4z" 1>&2
296+
ret=1
297+
ok=0
298+
fi
299+
;;
300+
"dscp_fwd")
301+
if [ $pc4 -eq 0 ] || [ $pc4z -eq 0 ]; then
302+
echo "FAIL: dscp counters do not match, expected dscp3 and dscp0 > 0 but got $pc4,$pc4z" 1>&2
303+
ret=1
304+
ok=0
305+
fi
306+
;;
307+
"dscp_ingress")
308+
if [ $pc4 -eq 0 ] || [ $pc4z -gt 0 ]; then
309+
echo "FAIL: dscp counters do not match, expected dscp3 > 0, dscp0 == 0 but got $pc4,$pc4z" 1>&2
310+
ret=1
311+
ok=0
312+
fi
313+
;;
314+
"dscp_egress")
315+
if [ $pc4 -eq 0 ] || [ $pc4z -gt 0 ]; then
316+
echo "FAIL: dscp counters do not match, expected dscp3 > 0, dscp0 == 0 but got $pc4,$pc4z" 1>&2
317+
ret=1
318+
ok=0
319+
fi
320+
;;
321+
*)
322+
echo "FAIL: Unknown DSCP check" 1>&2
323+
ret=1
324+
ok=0
325+
esac
326+
327+
if [ $ok -eq 1 ] ;then
328+
echo "PASS: $what: dscp packet counters match"
329+
fi
330+
}
331+
258332
check_transfer()
259333
{
260334
in=$1
@@ -286,17 +360,26 @@ test_tcp_forwarding_ip()
286360
ip netns exec $nsa nc -w 4 "$dstip" "$dstport" < "$nsin" > "$ns1out" &
287361
cpid=$!
288362

289-
sleep 3
363+
sleep 1
290364

291-
if ps -p $lpid > /dev/null;then
365+
prev="$(ls -l $ns1out $ns2out)"
366+
sleep 1
367+
368+
while [[ "$prev" != "$(ls -l $ns1out $ns2out)" ]]; do
369+
sleep 1;
370+
prev="$(ls -l $ns1out $ns2out)"
371+
done
372+
373+
if test -d /proc/"$lpid"/; then
292374
kill $lpid
293375
fi
294376

295-
if ps -p $cpid > /dev/null;then
377+
if test -d /proc/"$cpid"/; then
296378
kill $cpid
297379
fi
298380

299-
wait
381+
wait $lpid
382+
wait $cpid
300383

301384
if ! check_transfer "$nsin" "$ns2out" "ns1 -> ns2"; then
302385
lret=1
@@ -316,6 +399,51 @@ test_tcp_forwarding()
316399
return $?
317400
}
318401

402+
test_tcp_forwarding_set_dscp()
403+
{
404+
check_dscp "dscp_none"
405+
406+
ip netns exec $nsr1 nft -f - <<EOF
407+
table netdev dscpmangle {
408+
chain setdscp0 {
409+
type filter hook ingress device "veth0" priority 0; policy accept
410+
ip dscp set cs3
411+
}
412+
}
413+
EOF
414+
if [ $? -eq 0 ]; then
415+
test_tcp_forwarding_ip "$1" "$2" 10.0.2.99 12345
416+
check_dscp "dscp_ingress"
417+
418+
ip netns exec $nsr1 nft delete table netdev dscpmangle
419+
else
420+
echo "SKIP: Could not load netdev:ingress for veth0"
421+
fi
422+
423+
ip netns exec $nsr1 nft -f - <<EOF
424+
table netdev dscpmangle {
425+
chain setdscp0 {
426+
type filter hook egress device "veth1" priority 0; policy accept
427+
ip dscp set cs3
428+
}
429+
}
430+
EOF
431+
if [ $? -eq 0 ]; then
432+
test_tcp_forwarding_ip "$1" "$2" 10.0.2.99 12345
433+
check_dscp "dscp_egress"
434+
435+
ip netns exec $nsr1 nft flush table netdev dscpmangle
436+
else
437+
echo "SKIP: Could not load netdev:egress for veth1"
438+
fi
439+
440+
# partial. If flowtable really works, then both dscp-is-0 and dscp-is-cs3
441+
# counters should have seen packets (before and after ft offload kicks in).
442+
ip netns exec $nsr1 nft -a insert rule inet filter forward ip dscp set cs3
443+
test_tcp_forwarding_ip "$1" "$2" 10.0.2.99 12345
444+
check_dscp "dscp_fwd"
445+
}
446+
319447
test_tcp_forwarding_nat()
320448
{
321449
local lret
@@ -385,6 +513,11 @@ table ip nat {
385513
}
386514
EOF
387515

516+
if ! test_tcp_forwarding_set_dscp $ns1 $ns2 0 ""; then
517+
echo "FAIL: flow offload for ns1/ns2 with dscp update" 1>&2
518+
exit 0
519+
fi
520+
388521
if ! test_tcp_forwarding_nat $ns1 $ns2 0 ""; then
389522
echo "FAIL: flow offload for ns1/ns2 with NAT" 1>&2
390523
ip netns exec $nsr1 nft list ruleset
@@ -489,8 +622,8 @@ ip -net $nsr1 addr add 10.0.1.1/24 dev veth0
489622
ip -net $nsr1 addr add dead:1::1/64 dev veth0
490623
ip -net $nsr1 link set up dev veth0
491624

492-
KEY_SHA="0x"$(ps -xaf | sha1sum | cut -d " " -f 1)
493-
KEY_AES="0x"$(ps -xaf | md5sum | cut -d " " -f 1)
625+
KEY_SHA="0x"$(ps -af | sha1sum | cut -d " " -f 1)
626+
KEY_AES="0x"$(ps -af | md5sum | cut -d " " -f 1)
494627
SPI1=$RANDOM
495628
SPI2=$RANDOM
496629

0 commit comments

Comments
 (0)