Skip to content

Commit

Permalink
netfilter: nf_conntrack: fix nf_conntrack_l3proto_register
Browse files Browse the repository at this point in the history
Before commit 2c352f4
(netfilter: nf_conntrack: prepare namespace support for
l4 protocol trackers), we register sysctl before register
protocol tracker. Thus, if sysctl is registration fails,
the protocol tracker will not be registered.

After that commit, if sysctl registration fails, protocol
registration still remains, so we leave things in intermediate
state.

To fix this, this patch registers sysctl before protocols.
And if protocol registration fail, sysctl is unregistered.

Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
  • Loading branch information
Gao feng authored and Pablo Neira Ayuso committed Jun 27, 2012
1 parent 392025f commit fa0f61f
Showing 1 changed file with 23 additions and 13 deletions.
36 changes: 23 additions & 13 deletions net/netfilter/nf_conntrack_proto.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,18 +253,23 @@ int nf_conntrack_l3proto_register(struct net *net,
{
int ret = 0;

if (net == &init_net)
ret = nf_conntrack_l3proto_register_net(proto);
if (proto->init_net) {
ret = proto->init_net(net);
if (ret < 0)
return ret;
}

ret = nf_ct_l3proto_register_sysctl(net, proto);
if (ret < 0)
return ret;

if (proto->init_net) {
ret = proto->init_net(net);
if (net == &init_net) {
ret = nf_conntrack_l3proto_register_net(proto);
if (ret < 0)
return ret;
nf_ct_l3proto_unregister_sysctl(net, proto);
}
return nf_ct_l3proto_register_sysctl(net, proto);

return ret;
}
EXPORT_SYMBOL_GPL(nf_conntrack_l3proto_register);

Expand Down Expand Up @@ -454,19 +459,24 @@ int nf_conntrack_l4proto_register(struct net *net,
struct nf_conntrack_l4proto *l4proto)
{
int ret = 0;
if (net == &init_net)
ret = nf_conntrack_l4proto_register_net(l4proto);

if (ret < 0)
return ret;

if (l4proto->init_net)
if (l4proto->init_net) {
ret = l4proto->init_net(net);
if (ret < 0)
return ret;
}

ret = nf_ct_l4proto_register_sysctl(net, l4proto);
if (ret < 0)
return ret;

return nf_ct_l4proto_register_sysctl(net, l4proto);
if (net == &init_net) {
ret = nf_conntrack_l4proto_register_net(l4proto);
if (ret < 0)
nf_ct_l4proto_unregister_sysctl(net, l4proto);
}

return ret;
}
EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_register);

Expand Down

0 comments on commit fa0f61f

Please sign in to comment.