Skip to content

Commit 2cdaa3e

Browse files
committed
netfilter: conntrack: restore IPS_CONFIRMED out of nf_conntrack_hash_check_insert()
e6d57e9 ("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: e6d57e9 ("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>
1 parent 92e8c73 commit 2cdaa3e

File tree

3 files changed

+4
-1
lines changed

3 files changed

+4
-1
lines changed

net/netfilter/nf_conntrack_bpf.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ __bpf_kfunc struct nf_conn *bpf_ct_insert_entry(struct nf_conn___init *nfct_i)
381381
struct nf_conn *nfct = (struct nf_conn *)nfct_i;
382382
int err;
383383

384+
nfct->status |= IPS_CONFIRMED;
384385
err = nf_conntrack_hash_check_insert(nfct);
385386
if (err < 0) {
386387
nf_conntrack_free(nfct);

net/netfilter/nf_conntrack_core.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,6 @@ nf_conntrack_hash_check_insert(struct nf_conn *ct)
932932
goto out;
933933
}
934934

935-
ct->status |= IPS_CONFIRMED;
936935
smp_wmb();
937936
/* The caller holds a reference to this object */
938937
refcount_set(&ct->ct_general.use, 2);

net/netfilter/nf_conntrack_netlink.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2316,6 +2316,9 @@ ctnetlink_create_conntrack(struct net *net,
23162316
nfct_seqadj_ext_add(ct);
23172317
nfct_synproxy_ext_add(ct);
23182318

2319+
/* we must add conntrack extensions before confirmation. */
2320+
ct->status |= IPS_CONFIRMED;
2321+
23192322
if (cda[CTA_STATUS]) {
23202323
err = ctnetlink_change_status(ct, cda);
23212324
if (err < 0)

0 commit comments

Comments
 (0)