]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
selftests: netfilter: nft_queue.sh: add test for disappearing listener
authorFlorian Westphal <fw@strlen.de>
Tue, 25 Jun 2024 19:07:44 +0000 (21:07 +0200)
committerPablo Neira Ayuso <pablo@netfilter.org>
Fri, 28 Jun 2024 15:57:43 +0000 (17:57 +0200)
If userspace program exits while the queue its subscribed to has packets
those need to be discarded.

commit dc21c6cc3d69 ("netfilter: nfnetlink_queue: acquire rcu_read_lock()
in instance_destroy_rcu()") fixed a (harmless) rcu splat that could be
triggered in this case.

Add a test case to cover this.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
tools/testing/selftests/net/netfilter/nft_queue.sh

index 8538f08c64c2750ad36285700d18703dbc1084f4..c61d23a8c88db77ed23dc1bae6e9dae927be8f00 100755 (executable)
@@ -375,6 +375,42 @@ EOF
        wait 2>/dev/null
 }
 
+test_queue_removal()
+{
+       read tainted_then < /proc/sys/kernel/tainted
+
+       ip netns exec "$ns1" nft -f - <<EOF
+flush ruleset
+table ip filter {
+       chain output {
+               type filter hook output priority 0; policy accept;
+               ip protocol icmp queue num 0
+       }
+}
+EOF
+       ip netns exec "$ns1" ./nf_queue -q 0 -d 30000 -t "$timeout" &
+       local nfqpid=$!
+
+       busywait "$BUSYWAIT_TIMEOUT" nf_queue_wait "$ns1" 0
+
+       ip netns exec "$ns1" ping -w 2 -f -c 10 127.0.0.1 -q >/dev/null
+       kill $nfqpid
+
+       ip netns exec "$ns1" nft flush ruleset
+
+       if [ "$tainted_then" -ne 0 ];then
+               return
+       fi
+
+       read tainted_now < /proc/sys/kernel/tainted
+       if [ "$tainted_now" -eq 0 ];then
+               echo "PASS: queue program exiting while packets queued"
+       else
+               echo "TAINT: queue program exiting while packets queued"
+               ret=1
+       fi
+}
+
 ip netns exec "$nsrouter" sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
 ip netns exec "$nsrouter" sysctl net.ipv4.conf.veth0.forwarding=1 > /dev/null
 ip netns exec "$nsrouter" sysctl net.ipv4.conf.veth1.forwarding=1 > /dev/null
@@ -413,5 +449,6 @@ test_tcp_localhost
 test_tcp_localhost_connectclose
 test_tcp_localhost_requeue
 test_icmp_vrf
+test_queue_removal
 
 exit $ret