]> err.no Git - linux-2.6/blobdiff - net/ipv4/netfilter/arp_tables.c
[IPV4]: esp_output() misannotations
[linux-2.6] / net / ipv4 / netfilter / arp_tables.c
index ec64b679641db6ca1b14efd518e884f3e70676db..a7591ce344d2c18a747c717ded8fa96671e2dcc8 100644 (file)
@@ -1773,6 +1773,7 @@ void arpt_unregister_table(struct arpt_table *table)
 {
        struct xt_table_info *private;
        void *loc_cpu_entry;
+       struct module *table_owner = table->me;
 
        private = xt_unregister_table(table);
 
@@ -1780,6 +1781,8 @@ void arpt_unregister_table(struct arpt_table *table)
        loc_cpu_entry = private->entries[raw_smp_processor_id()];
        ARPT_ENTRY_ITERATE(loc_cpu_entry, private->size,
                           cleanup_entry, NULL);
+       if (private->number > private->initial_entries)
+               module_put(table_owner);
        xt_free_table_info(private);
 }
 
@@ -1819,11 +1822,26 @@ static struct nf_sockopt_ops arpt_sockopts = {
        .owner          = THIS_MODULE,
 };
 
+static int __net_init arp_tables_net_init(struct net *net)
+{
+       return xt_proto_init(net, NF_ARP);
+}
+
+static void __net_exit arp_tables_net_exit(struct net *net)
+{
+       xt_proto_fini(net, NF_ARP);
+}
+
+static struct pernet_operations arp_tables_net_ops = {
+       .init = arp_tables_net_init,
+       .exit = arp_tables_net_exit,
+};
+
 static int __init arp_tables_init(void)
 {
        int ret;
 
-       ret = xt_proto_init(NF_ARP);
+       ret = register_pernet_subsys(&arp_tables_net_ops);
        if (ret < 0)
                goto err1;
 
@@ -1848,7 +1866,7 @@ err4:
 err3:
        xt_unregister_target(&arpt_standard_target);
 err2:
-       xt_proto_fini(NF_ARP);
+       unregister_pernet_subsys(&arp_tables_net_ops);
 err1:
        return ret;
 }
@@ -1858,7 +1876,7 @@ static void __exit arp_tables_fini(void)
        nf_unregister_sockopt(&arpt_sockopts);
        xt_unregister_target(&arpt_error_target);
        xt_unregister_target(&arpt_standard_target);
-       xt_proto_fini(NF_ARP);
+       unregister_pernet_subsys(&arp_tables_net_ops);
 }
 
 EXPORT_SYMBOL(arpt_register_table);