aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/netfilter/x_tables.h6
-rw-r--r--net/ipv4/netfilter/arp_tables.c7
-rw-r--r--net/ipv4/netfilter/ip_tables.c7
-rw-r--r--net/ipv6/netfilter/ip6_tables.c7
-rw-r--r--net/netfilter/x_tables.c14
5 files changed, 23 insertions, 18 deletions
diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
index 90dc6ea2a683..937cebb3ab54 100644
--- a/include/linux/netfilter/x_tables.h
+++ b/include/linux/netfilter/x_tables.h
@@ -335,9 +335,9 @@ extern int xt_check_target(const struct xt_target *target, unsigned short family
335 unsigned int size, const char *table, unsigned int hook, 335 unsigned int size, const char *table, unsigned int hook,
336 unsigned short proto, int inv_proto); 336 unsigned short proto, int inv_proto);
337 337
338extern int xt_register_table(struct xt_table *table, 338extern struct xt_table *xt_register_table(struct xt_table *table,
339 struct xt_table_info *bootstrap, 339 struct xt_table_info *bootstrap,
340 struct xt_table_info *newinfo); 340 struct xt_table_info *newinfo);
341extern void *xt_unregister_table(struct xt_table *table); 341extern void *xt_unregister_table(struct xt_table *table);
342 342
343extern struct xt_table_info *xt_replace_table(struct xt_table *table, 343extern struct xt_table_info *xt_replace_table(struct xt_table *table,
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index b4a810c28ac8..060de950e6ac 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -1727,6 +1727,7 @@ int arpt_register_table(struct arpt_table *table,
1727 struct xt_table_info bootstrap 1727 struct xt_table_info bootstrap
1728 = { 0, 0, 0, { 0 }, { 0 }, { } }; 1728 = { 0, 0, 0, { 0 }, { 0 }, { } };
1729 void *loc_cpu_entry; 1729 void *loc_cpu_entry;
1730 struct xt_table *new_table;
1730 1731
1731 newinfo = xt_alloc_table_info(repl->size); 1732 newinfo = xt_alloc_table_info(repl->size);
1732 if (!newinfo) { 1733 if (!newinfo) {
@@ -1750,10 +1751,10 @@ int arpt_register_table(struct arpt_table *table,
1750 return ret; 1751 return ret;
1751 } 1752 }
1752 1753
1753 ret = xt_register_table(table, &bootstrap, newinfo); 1754 new_table = xt_register_table(table, &bootstrap, newinfo);
1754 if (ret != 0) { 1755 if (IS_ERR(new_table)) {
1755 xt_free_table_info(newinfo); 1756 xt_free_table_info(newinfo);
1756 return ret; 1757 return PTR_ERR(new_table);
1757 } 1758 }
1758 1759
1759 return 0; 1760 return 0;
diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
index 628a6b58ddb8..1b7c09e4a007 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -2055,6 +2055,7 @@ int ipt_register_table(struct xt_table *table, const struct ipt_replace *repl)
2055 struct xt_table_info bootstrap 2055 struct xt_table_info bootstrap
2056 = { 0, 0, 0, { 0 }, { 0 }, { } }; 2056 = { 0, 0, 0, { 0 }, { 0 }, { } };
2057 void *loc_cpu_entry; 2057 void *loc_cpu_entry;
2058 struct xt_table *new_table;
2058 2059
2059 newinfo = xt_alloc_table_info(repl->size); 2060 newinfo = xt_alloc_table_info(repl->size);
2060 if (!newinfo) 2061 if (!newinfo)
@@ -2074,10 +2075,10 @@ int ipt_register_table(struct xt_table *table, const struct ipt_replace *repl)
2074 return ret; 2075 return ret;
2075 } 2076 }
2076 2077
2077 ret = xt_register_table(table, &bootstrap, newinfo); 2078 new_table = xt_register_table(table, &bootstrap, newinfo);
2078 if (ret != 0) { 2079 if (IS_ERR(new_table)) {
2079 xt_free_table_info(newinfo); 2080 xt_free_table_info(newinfo);
2080 return ret; 2081 return PTR_ERR(new_table);
2081 } 2082 }
2082 2083
2083 return 0; 2084 return 0;
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
index 92b4898344ff..f7a62398d7b7 100644
--- a/net/ipv6/netfilter/ip6_tables.c
+++ b/net/ipv6/netfilter/ip6_tables.c
@@ -2081,6 +2081,7 @@ int ip6t_register_table(struct xt_table *table, const struct ip6t_replace *repl)
2081 struct xt_table_info bootstrap 2081 struct xt_table_info bootstrap
2082 = { 0, 0, 0, { 0 }, { 0 }, { } }; 2082 = { 0, 0, 0, { 0 }, { 0 }, { } };
2083 void *loc_cpu_entry; 2083 void *loc_cpu_entry;
2084 struct xt_table *new_table;
2084 2085
2085 newinfo = xt_alloc_table_info(repl->size); 2086 newinfo = xt_alloc_table_info(repl->size);
2086 if (!newinfo) 2087 if (!newinfo)
@@ -2100,10 +2101,10 @@ int ip6t_register_table(struct xt_table *table, const struct ip6t_replace *repl)
2100 return ret; 2101 return ret;
2101 } 2102 }
2102 2103
2103 ret = xt_register_table(table, &bootstrap, newinfo); 2104 new_table = xt_register_table(table, &bootstrap, newinfo);
2104 if (ret != 0) { 2105 if (IS_ERR(new_table)) {
2105 xt_free_table_info(newinfo); 2106 xt_free_table_info(newinfo);
2106 return ret; 2107 return PTR_ERR(new_table);
2107 } 2108 }
2108 2109
2109 return 0; 2110 return 0;
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 8d4fca96a4a7..d8d8637739ba 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -660,9 +660,9 @@ xt_replace_table(struct xt_table *table,
660} 660}
661EXPORT_SYMBOL_GPL(xt_replace_table); 661EXPORT_SYMBOL_GPL(xt_replace_table);
662 662
663int xt_register_table(struct xt_table *table, 663struct xt_table *xt_register_table(struct xt_table *table,
664 struct xt_table_info *bootstrap, 664 struct xt_table_info *bootstrap,
665 struct xt_table_info *newinfo) 665 struct xt_table_info *newinfo)
666{ 666{
667 int ret; 667 int ret;
668 struct xt_table_info *private; 668 struct xt_table_info *private;
@@ -670,7 +670,7 @@ int xt_register_table(struct xt_table *table,
670 670
671 ret = mutex_lock_interruptible(&xt[table->af].mutex); 671 ret = mutex_lock_interruptible(&xt[table->af].mutex);
672 if (ret != 0) 672 if (ret != 0)
673 return ret; 673 goto out;
674 674
675 /* Don't autoload: we'd eat our tail... */ 675 /* Don't autoload: we'd eat our tail... */
676 list_for_each_entry(t, &xt[table->af].tables, list) { 676 list_for_each_entry(t, &xt[table->af].tables, list) {
@@ -693,11 +693,13 @@ int xt_register_table(struct xt_table *table,
693 private->initial_entries = private->number; 693 private->initial_entries = private->number;
694 694
695 list_add(&table->list, &xt[table->af].tables); 695 list_add(&table->list, &xt[table->af].tables);
696 mutex_unlock(&xt[table->af].mutex);
697 return table;
696 698
697 ret = 0;
698 unlock: 699 unlock:
699 mutex_unlock(&xt[table->af].mutex); 700 mutex_unlock(&xt[table->af].mutex);
700 return ret; 701out:
702 return ERR_PTR(ret);
701} 703}
702EXPORT_SYMBOL_GPL(xt_register_table); 704EXPORT_SYMBOL_GPL(xt_register_table);
703 705