Skip to content

Commit

Permalink
netfilter: nf_conntrack: fix conntrack lookup race
Browse files Browse the repository at this point in the history
The RCU protected conntrack hash lookup only checks whether the entry
has a refcount of zero to decide whether it is stale. This is not
sufficient, entries are explicitly removed while there is at least
one reference left, possibly more. Explicitly check whether the entry
has been marked as dying to fix this.

Signed-off-by: Patrick McHardy <[email protected]>
  • Loading branch information
kaber committed Jun 22, 2009
1 parent 5c8ec91 commit 8d8890b
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions net/netfilter/nf_conntrack_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,8 @@ nf_conntrack_find_get(struct net *net, const struct nf_conntrack_tuple *tuple)
h = __nf_conntrack_find(net, tuple);
if (h) {
ct = nf_ct_tuplehash_to_ctrack(h);
if (unlikely(!atomic_inc_not_zero(&ct->ct_general.use)))
if (unlikely(nf_ct_is_dying(ct) ||
!atomic_inc_not_zero(&ct->ct_general.use)))
h = NULL;
else {
if (unlikely(!nf_ct_tuple_equal(tuple, &h->tuple))) {
Expand Down Expand Up @@ -510,7 +511,8 @@ static noinline int early_drop(struct net *net, unsigned int hash)
cnt++;
}

if (ct && unlikely(!atomic_inc_not_zero(&ct->ct_general.use)))
if (ct && unlikely(nf_ct_is_dying(ct) ||
!atomic_inc_not_zero(&ct->ct_general.use)))
ct = NULL;
if (ct || cnt >= NF_CT_EVICTION_RANGE)
break;
Expand Down

0 comments on commit 8d8890b

Please sign in to comment.