netfilter: synproxy: protect nf_ct_seqadj_init() with conntrack lock
nf_ct_seqadj_init() is called without holding the ct lock. This can race
with nf_ct_seq_adjust() when a connection is in CLOSE state due to an
RST or connection reopening. In addition for SYN_RECV state, concurrent
processing of packets can trigger nf_ct_seq_adjust() too. These
situations create a read/write data race.
As synproxy is the only user of nf_ct_seqadj_init() at the moment, fix
this by holding ct->lock inside nf_ct_seqadj_init() until all is done.
Fixes: 48b1de4c11 ("netfilter: add SYNPROXY core/target")
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
1 parent
992c20bc8a
commit
9e37388b80
1 file changed
+2
@@ -17,12 +17,14 @@ int nf_ct_seqadj_init(struct nf_conn *ct, enum ip_conntrack_info ctinfo,
|
||||
if (off == 0)
|
||||
return 0;
|
||||
|
||||
spin_lock_bh(&ct->lock);
|
||||
set_bit(IPS_SEQ_ADJUST_BIT, &ct->status);
|
||||
|
||||
seqadj = nfct_seqadj(ct);
|
||||
this_way = &seqadj->seq[dir];
|
||||
this_way->offset_before = off;
|
||||
this_way->offset_after = off;
|
||||
spin_unlock_bh(&ct->lock);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nf_ct_seqadj_init);
|
||||
|
||||
Reference in new issue
Block a user