]> git.baikalelectronics.ru Git - kernel.git/commit
netfilter: nf_conntrack: death_by_timeout() fix
authorEric Dumazet <eric.dumazet@gmail.com>
Mon, 22 Jun 2009 12:13:55 +0000 (14:13 +0200)
committerPatrick McHardy <kaber@trash.net>
Mon, 22 Jun 2009 12:13:55 +0000 (14:13 +0200)
commit2d786a700b4fcfc5e049794650a8bab20f37535d
tree95934002dceac963afa7b135b39a9b2b6bdce368
parentf5198a475fcfe4f324eb80e278a78e963f3d5b4e
netfilter: nf_conntrack: death_by_timeout() fix

death_by_timeout() might delete a conntrack from hash list
and insert it in dying list.

 nf_ct_delete_from_lists(ct);
 nf_ct_insert_dying_list(ct);

I believe a (lockless) reader could *catch* ct while doing a lookup
and miss the end of its chain.
(nulls lookup algo must check the null value at the end of lookup and
should restart if the null value is not the expected one.
cf Documentation/RCU/rculist_nulls.txt for details)

We need to change nf_conntrack_init_net() and use a different "null" value,
guaranteed not being used in regular lists. Choose very large values, since
hash table uses [0..size-1] null values.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Patrick McHardy <kaber@trash.net>
net/netfilter/nf_conntrack_core.c