netfilter: xtables: add struct xt_mtdtor_param::net
Add ->net to match destructor list like ->net in constructor list. Make sure it's set in ebtables/iptables/ip6tables, this requires to propagate netns up to *_unregister_table(). Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com> Signed-off-by: Patrick McHardy <kaber@trash.net>
This commit is contained in:
committed by
Patrick McHardy
parent
a83d8e8d09
commit
f54e9367f8
@@ -71,7 +71,7 @@ static int __net_init broute_net_init(struct net *net)
|
||||
|
||||
static void __net_exit broute_net_exit(struct net *net)
|
||||
{
|
||||
ebt_unregister_table(net->xt.broute_table);
|
||||
ebt_unregister_table(net, net->xt.broute_table);
|
||||
}
|
||||
|
||||
static struct pernet_operations broute_net_ops = {
|
||||
|
@@ -107,7 +107,7 @@ static int __net_init frame_filter_net_init(struct net *net)
|
||||
|
||||
static void __net_exit frame_filter_net_exit(struct net *net)
|
||||
{
|
||||
ebt_unregister_table(net->xt.frame_filter);
|
||||
ebt_unregister_table(net, net->xt.frame_filter);
|
||||
}
|
||||
|
||||
static struct pernet_operations frame_filter_net_ops = {
|
||||
|
@@ -107,7 +107,7 @@ static int __net_init frame_nat_net_init(struct net *net)
|
||||
|
||||
static void __net_exit frame_nat_net_exit(struct net *net)
|
||||
{
|
||||
ebt_unregister_table(net->xt.frame_nat);
|
||||
ebt_unregister_table(net, net->xt.frame_nat);
|
||||
}
|
||||
|
||||
static struct pernet_operations frame_nat_net_ops = {
|
||||
|
@@ -561,13 +561,14 @@ ebt_get_udc_positions(struct ebt_entry *e, struct ebt_table_info *newinfo,
|
||||
}
|
||||
|
||||
static inline int
|
||||
ebt_cleanup_match(struct ebt_entry_match *m, unsigned int *i)
|
||||
ebt_cleanup_match(struct ebt_entry_match *m, struct net *net, unsigned int *i)
|
||||
{
|
||||
struct xt_mtdtor_param par;
|
||||
|
||||
if (i && (*i)-- == 0)
|
||||
return 1;
|
||||
|
||||
par.net = net;
|
||||
par.match = m->u.match;
|
||||
par.matchinfo = m->data;
|
||||
par.family = NFPROTO_BRIDGE;
|
||||
@@ -595,7 +596,7 @@ ebt_cleanup_watcher(struct ebt_entry_watcher *w, unsigned int *i)
|
||||
}
|
||||
|
||||
static inline int
|
||||
ebt_cleanup_entry(struct ebt_entry *e, unsigned int *cnt)
|
||||
ebt_cleanup_entry(struct ebt_entry *e, struct net *net, unsigned int *cnt)
|
||||
{
|
||||
struct xt_tgdtor_param par;
|
||||
struct ebt_entry_target *t;
|
||||
@@ -606,7 +607,7 @@ ebt_cleanup_entry(struct ebt_entry *e, unsigned int *cnt)
|
||||
if (cnt && (*cnt)-- == 0)
|
||||
return 1;
|
||||
EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, NULL);
|
||||
EBT_MATCH_ITERATE(e, ebt_cleanup_match, NULL);
|
||||
EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, NULL);
|
||||
t = (struct ebt_entry_target *)(((char *)e) + e->target_offset);
|
||||
|
||||
par.target = t->u.target;
|
||||
@@ -731,7 +732,7 @@ ebt_check_entry(struct ebt_entry *e,
|
||||
cleanup_watchers:
|
||||
EBT_WATCHER_ITERATE(e, ebt_cleanup_watcher, &j);
|
||||
cleanup_matches:
|
||||
EBT_MATCH_ITERATE(e, ebt_cleanup_match, &i);
|
||||
EBT_MATCH_ITERATE(e, ebt_cleanup_match, net, &i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -924,7 +925,7 @@ static int translate_table(struct net *net, char *name,
|
||||
ebt_check_entry, net, newinfo, name, &i, cl_s, udc_cnt);
|
||||
if (ret != 0) {
|
||||
EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
|
||||
ebt_cleanup_entry, &i);
|
||||
ebt_cleanup_entry, net, &i);
|
||||
}
|
||||
vfree(cl_s);
|
||||
return ret;
|
||||
@@ -1074,7 +1075,7 @@ static int do_replace(struct net *net, void __user *user, unsigned int len)
|
||||
|
||||
/* decrease module count and free resources */
|
||||
EBT_ENTRY_ITERATE(table->entries, table->entries_size,
|
||||
ebt_cleanup_entry, NULL);
|
||||
ebt_cleanup_entry, net, NULL);
|
||||
|
||||
vfree(table->entries);
|
||||
if (table->chainstack) {
|
||||
@@ -1091,7 +1092,7 @@ free_unlock:
|
||||
mutex_unlock(&ebt_mutex);
|
||||
free_iterate:
|
||||
EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,
|
||||
ebt_cleanup_entry, NULL);
|
||||
ebt_cleanup_entry, net, NULL);
|
||||
free_counterstmp:
|
||||
vfree(counterstmp);
|
||||
/* can be initialized in translate_table() */
|
||||
@@ -1208,7 +1209,7 @@ out:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
void ebt_unregister_table(struct ebt_table *table)
|
||||
void ebt_unregister_table(struct net *net, struct ebt_table *table)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -1220,7 +1221,7 @@ void ebt_unregister_table(struct ebt_table *table)
|
||||
list_del(&table->list);
|
||||
mutex_unlock(&ebt_mutex);
|
||||
EBT_ENTRY_ITERATE(table->private->entries, table->private->entries_size,
|
||||
ebt_cleanup_entry, NULL);
|
||||
ebt_cleanup_entry, net, NULL);
|
||||
if (table->private->nentries)
|
||||
module_put(table->me);
|
||||
vfree(table->private->entries);
|
||||
|
Reference in New Issue
Block a user