]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
netfilter: conntrack: restore IPS_CONFIRMED out of nf_conntrack_hash_check_insert()
authorPablo Neira Ayuso <pablo@netfilter.org>
Tue, 18 Apr 2023 21:31:26 +0000 (23:31 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:11:17 +0000 (23:11 +0900)
[ Upstream commit 2cdaa3eefed83082923cf219c8b6a314e622da74 ]

e6d57e9ff0ae ("netfilter: conntrack: fix rmmod double-free race")
consolidates IPS_CONFIRMED bit set in nf_conntrack_hash_check_insert().
However, this breaks ctnetlink:

 # conntrack -I -p tcp --timeout 123 --src 1.2.3.4 --dst 5.6.7.8 --state ESTABLISHED --sport 1 --dport 4 -u SEEN_REPLY
 conntrack v1.4.6 (conntrack-tools): Operation failed: Device or resource busy

This is a partial revert of the aforementioned commit to restore
IPS_CONFIRMED.

Fixes: e6d57e9ff0ae ("netfilter: conntrack: fix rmmod double-free race")
Reported-by: Stéphane Graber <stgraber@stgraber.org>
Tested-by: Stéphane Graber <stgraber@stgraber.org>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/netfilter/nf_conntrack_bpf.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_netlink.c

index e1af14e3b63c50f7795f4512c41dfd7be4890f71..24002bc61e07ef332887742d9af906027bc59805 100644 (file)
@@ -381,6 +381,7 @@ struct nf_conn *bpf_ct_insert_entry(struct nf_conn___init *nfct_i)
        struct nf_conn *nfct = (struct nf_conn *)nfct_i;
        int err;
 
+       nfct->status |= IPS_CONFIRMED;
        err = nf_conntrack_hash_check_insert(nfct);
        if (err < 0) {
                nf_conntrack_free(nfct);
index 19e3afb23fdaf77f5931e2adcbfb9e8fb99e71fe..cf731546e865b294ea0a668845bd43fa4948e8aa 100644 (file)
@@ -934,7 +934,6 @@ nf_conntrack_hash_check_insert(struct nf_conn *ct)
                goto out;
        }
 
-       ct->status |= IPS_CONFIRMED;
        smp_wmb();
        /* The caller holds a reference to this object */
        refcount_set(&ct->ct_general.use, 2);
index d095d3c1ceca6cc59f59247b39d019f605fa8725..a68391e228f0ea63b813267056c174b9cbd47e5a 100644 (file)
@@ -2316,6 +2316,9 @@ ctnetlink_create_conntrack(struct net *net,
        nfct_seqadj_ext_add(ct);
        nfct_synproxy_ext_add(ct);
 
+       /* we must add conntrack extensions before confirmation. */
+       ct->status |= IPS_CONFIRMED;
+
        if (cda[CTA_STATUS]) {
                err = ctnetlink_change_status(ct, cda);
                if (err < 0)