|
@@ -661,8 +661,8 @@ static int check_target(struct ipt_entry *e, const char *name)
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-find_check_entry(struct ipt_entry *e, const char *name, unsigned int size,
|
|
|
- unsigned int *i)
|
|
|
+find_check_entry(struct ipt_entry *e, struct net *net, const char *name,
|
|
|
+ unsigned int size, unsigned int *i)
|
|
|
{
|
|
|
struct ipt_entry_target *t;
|
|
|
struct xt_target *target;
|
|
@@ -675,6 +675,7 @@ find_check_entry(struct ipt_entry *e, const char *name, unsigned int size,
|
|
|
return ret;
|
|
|
|
|
|
j = 0;
|
|
|
+ mtpar.net = net;
|
|
|
mtpar.table = name;
|
|
|
mtpar.entryinfo = &e->ip;
|
|
|
mtpar.hook_mask = e->comefrom;
|
|
@@ -798,7 +799,8 @@ cleanup_entry(struct ipt_entry *e, unsigned int *i)
|
|
|
/* Checks and translates the user-supplied table segment (held in
|
|
|
newinfo) */
|
|
|
static int
|
|
|
-translate_table(const char *name,
|
|
|
+translate_table(struct net *net,
|
|
|
+ const char *name,
|
|
|
unsigned int valid_hooks,
|
|
|
struct xt_table_info *newinfo,
|
|
|
void *entry0,
|
|
@@ -860,7 +862,7 @@ translate_table(const char *name,
|
|
|
/* Finally, each sanity check must pass */
|
|
|
i = 0;
|
|
|
ret = IPT_ENTRY_ITERATE(entry0, newinfo->size,
|
|
|
- find_check_entry, name, size, &i);
|
|
|
+ find_check_entry, net, name, size, &i);
|
|
|
|
|
|
if (ret != 0) {
|
|
|
IPT_ENTRY_ITERATE(entry0, newinfo->size,
|
|
@@ -1303,7 +1305,7 @@ do_replace(struct net *net, void __user *user, unsigned int len)
|
|
|
goto free_newinfo;
|
|
|
}
|
|
|
|
|
|
- ret = translate_table(tmp.name, tmp.valid_hooks,
|
|
|
+ ret = translate_table(net, tmp.name, tmp.valid_hooks,
|
|
|
newinfo, loc_cpu_entry, tmp.size, tmp.num_entries,
|
|
|
tmp.hook_entry, tmp.underflow);
|
|
|
if (ret != 0)
|
|
@@ -1655,7 +1657,7 @@ compat_copy_entry_from_user(struct compat_ipt_entry *e, void **dstptr,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-compat_check_entry(struct ipt_entry *e, const char *name,
|
|
|
+compat_check_entry(struct ipt_entry *e, struct net *net, const char *name,
|
|
|
unsigned int *i)
|
|
|
{
|
|
|
struct xt_mtchk_param mtpar;
|
|
@@ -1663,6 +1665,7 @@ compat_check_entry(struct ipt_entry *e, const char *name,
|
|
|
int ret;
|
|
|
|
|
|
j = 0;
|
|
|
+ mtpar.net = net;
|
|
|
mtpar.table = name;
|
|
|
mtpar.entryinfo = &e->ip;
|
|
|
mtpar.hook_mask = e->comefrom;
|
|
@@ -1684,7 +1687,8 @@ compat_check_entry(struct ipt_entry *e, const char *name,
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
-translate_compat_table(const char *name,
|
|
|
+translate_compat_table(struct net *net,
|
|
|
+ const char *name,
|
|
|
unsigned int valid_hooks,
|
|
|
struct xt_table_info **pinfo,
|
|
|
void **pentry0,
|
|
@@ -1773,7 +1777,7 @@ translate_compat_table(const char *name,
|
|
|
|
|
|
i = 0;
|
|
|
ret = IPT_ENTRY_ITERATE(entry1, newinfo->size, compat_check_entry,
|
|
|
- name, &i);
|
|
|
+ net, name, &i);
|
|
|
if (ret) {
|
|
|
j -= i;
|
|
|
COMPAT_IPT_ENTRY_ITERATE_CONTINUE(entry0, newinfo->size, i,
|
|
@@ -1833,7 +1837,7 @@ compat_do_replace(struct net *net, void __user *user, unsigned int len)
|
|
|
goto free_newinfo;
|
|
|
}
|
|
|
|
|
|
- ret = translate_compat_table(tmp.name, tmp.valid_hooks,
|
|
|
+ ret = translate_compat_table(net, tmp.name, tmp.valid_hooks,
|
|
|
&newinfo, &loc_cpu_entry, tmp.size,
|
|
|
tmp.num_entries, tmp.hook_entry,
|
|
|
tmp.underflow);
|
|
@@ -2086,7 +2090,7 @@ struct xt_table *ipt_register_table(struct net *net,
|
|
|
loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
|
|
|
memcpy(loc_cpu_entry, repl->entries, repl->size);
|
|
|
|
|
|
- ret = translate_table(table->name, table->valid_hooks,
|
|
|
+ ret = translate_table(net, table->name, table->valid_hooks,
|
|
|
newinfo, loc_cpu_entry, repl->size,
|
|
|
repl->num_entries,
|
|
|
repl->hook_entry,
|