mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
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:
parent
992c20bc8a
commit
9e37388b80
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user