Patch "ipv6: tcp: add a missing nf_reset_ct() in 3WHS handling" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ipv6: tcp: add a missing nf_reset_ct() in 3WHS handling

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     ipv6-tcp-add-a-missing-nf_reset_ct-in-3whs-handling.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit dad19c72b1950c4722746ef9caa4f1839d60a46a
Author: Ilya Maximets <i.maximets@xxxxxxx>
Date:   Fri Sep 22 23:04:58 2023 +0200

    ipv6: tcp: add a missing nf_reset_ct() in 3WHS handling
    
    [ Upstream commit 9593c7cb6cf670ef724d17f7f9affd7a8d2ad0c5 ]
    
    Commit b0e214d21203 ("netfilter: keep conntrack reference until
    IPsecv6 policy checks are done") is a direct copy of the old
    commit b59c270104f0 ("[NETFILTER]: Keep conntrack reference until
    IPsec policy checks are done") but for IPv6.  However, it also
    copies a bug that this old commit had.  That is: when the third
    packet of 3WHS connection establishment contains payload, it is
    added into socket receive queue without the XFRM check and the
    drop of connection tracking context.
    
    That leads to nf_conntrack module being impossible to unload as
    it waits for all the conntrack references to be dropped while
    the packet release is deferred in per-cpu cache indefinitely, if
    not consumed by the application.
    
    The issue for IPv4 was fixed in commit 6f0012e35160 ("tcp: add a
    missing nf_reset_ct() in 3WHS handling") by adding a missing XFRM
    check and correctly dropping the conntrack context.  However, the
    issue was introduced to IPv6 code afterwards.  Fixing it the
    same way for IPv6 now.
    
    Fixes: b0e214d21203 ("netfilter: keep conntrack reference until IPsecv6 policy checks are done")
    Link: https://lore.kernel.org/netdev/d589a999-d4dd-2768-b2d5-89dec64a4a42@xxxxxxx/
    Signed-off-by: Ilya Maximets <i.maximets@xxxxxxx>
    Acked-by: Florian Westphal <fw@xxxxxxxxx>
    Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230922210530.2045146-1-i.maximets@xxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 4bdd356bb5c46..7be89dcfd5fc5 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -1644,9 +1644,12 @@ INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
 		struct sock *nsk;
 
 		sk = req->rsk_listener;
-		drop_reason = tcp_inbound_md5_hash(sk, skb,
-						   &hdr->saddr, &hdr->daddr,
-						   AF_INET6, dif, sdif);
+		if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
+			drop_reason = SKB_DROP_REASON_XFRM_POLICY;
+		else
+			drop_reason = tcp_inbound_md5_hash(sk, skb,
+							   &hdr->saddr, &hdr->daddr,
+							   AF_INET6, dif, sdif);
 		if (drop_reason) {
 			sk_drops_add(sk, skb);
 			reqsk_put(req);
@@ -1693,6 +1696,7 @@ INDIRECT_CALLABLE_SCOPE int tcp_v6_rcv(struct sk_buff *skb)
 			}
 			goto discard_and_relse;
 		}
+		nf_reset_ct(skb);
 		if (nsk == sk) {
 			reqsk_put(req);
 			tcp_v6_restore_cb(skb);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux