tcp_ipv6: set the drop_reason in the right place
authorJakub Kicinski <kuba@kernel.org>
Fri, 20 May 2022 02:13:47 +0000 (19:13 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 20 May 2022 16:35:42 +0000 (09:35 -0700)
Looks like the IPv6 version of the patch under Fixes was
a copy/paste of the IPv4 but hit the wrong spot.
It is tcp_v6_rcv() which uses drop_reason as a boolean, and
needs to be protected against reason == 0 before calling free.
tcp_v6_do_rcv() has a pretty straightforward flow.

The resulting warning looks like this:
  WARNING: CPU: 1 PID: 0 at net/core/skbuff.c:775
  Call Trace:
    tcp_v6_rcv (net/ipv6/tcp_ipv6.c:1767)
    ip6_protocol_deliver_rcu (net/ipv6/ip6_input.c:438)
    ip6_input_finish (include/linux/rcupdate.h:726)
    ip6_input (include/linux/netfilter.h:307)

Fixes: f8319dfd1b3b ("net: tcp: reset 'drop_reason' to NOT_SPCIFIED in tcp_v{4,6}_rcv()")
Tested-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Link: https://lore.kernel.org/r/20220520021347.2270207-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/tcp_ipv6.c

index 28e47ca..f37dd4a 100644 (file)
@@ -1509,7 +1509,6 @@ reset:
 discard:
        if (opt_skb)
                __kfree_skb(opt_skb);
-       SKB_DR_OR(reason, NOT_SPECIFIED);
        kfree_skb_reason(skb, reason);
        return 0;
 csum_err:
@@ -1763,6 +1762,7 @@ bad_packet:
        }
 
 discard_it:
+       SKB_DR_OR(drop_reason, NOT_SPECIFIED);
        kfree_skb_reason(skb, drop_reason);
        return 0;