[CTNETLINK] Fix race condition on conntrack creation Current conntrack creation path can run into rare race conditions, make the creation process atomic. Signed-off-by: Pablo Neira Ayuso Index: net-2.6/net/ipv4/netfilter/ip_conntrack_netlink.c =================================================================== --- net-2.6.orig/net/ipv4/netfilter/ip_conntrack_netlink.c 2006-07-07 00:15:14.000000000 +0200 +++ net-2.6/net/ipv4/netfilter/ip_conntrack_netlink.c 2006-07-07 01:52:14.000000000 +0200 @@ -1059,13 +1059,12 @@ ctnetlink_create_conntrack(struct nfattr ct->mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1])); #endif - ct->helper = ip_conntrack_helper_find_get(rtuple); - - add_timer(&ct->timeout); + /* we do no want any races on hash insertion */ + write_lock_bh(&ip_conntrack_lock); + ct->helper = ip_conntrack_helper_find(rtuple); ip_conntrack_hash_insert(ct); - - if (ct->helper) - ip_conntrack_helper_put(ct->helper); + add_timer(&ct->timeout); + write_unlock_bh(&ip_conntrack_lock); DEBUGP("conntrack with id %u inserted\n", ct->id); return 0; Index: net-2.6/net/netfilter/nf_conntrack_netlink.c =================================================================== --- net-2.6.orig/net/netfilter/nf_conntrack_netlink.c 2006-07-07 00:15:14.000000000 +0200 +++ net-2.6/net/netfilter/nf_conntrack_netlink.c 2006-07-07 01:52:32.000000000 +0200 @@ -1079,8 +1079,12 @@ ctnetlink_create_conntrack(struct nfattr ct->mark = ntohl(*(u_int32_t *)NFA_DATA(cda[CTA_MARK-1])); #endif - add_timer(&ct->timeout); + /* we do no want any races on hash insertion */ + write_lock_bh(&nf_conntrack_lock); + ct->helper = nf_conntrack_helper_find(rtuple); nf_conntrack_hash_insert(ct); + add_timer(&ct->timeout); + write_unlock_bh(&nf_conntrack_lock); DEBUGP("conntrack with id %u inserted\n", ct->id); return 0;