|
@@ -1090,7 +1090,8 @@ compat_calc_match(struct ipt_entry_match *m, int * size)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int compat_calc_entry(struct ipt_entry *e, struct xt_table_info *info,
|
|
|
+static int compat_calc_entry(struct ipt_entry *e,
|
|
|
+ const struct xt_table_info *info,
|
|
|
void *base, struct xt_table_info *newinfo)
|
|
|
{
|
|
|
struct ipt_entry_target *t;
|
|
@@ -1118,22 +1119,17 @@ static int compat_calc_entry(struct ipt_entry *e, struct xt_table_info *info,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int compat_table_info(struct xt_table_info *info,
|
|
|
+static int compat_table_info(const struct xt_table_info *info,
|
|
|
struct xt_table_info *newinfo)
|
|
|
{
|
|
|
void *loc_cpu_entry;
|
|
|
- int i;
|
|
|
|
|
|
if (!newinfo || !info)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- memset(newinfo, 0, sizeof(struct xt_table_info));
|
|
|
- newinfo->size = info->size;
|
|
|
- newinfo->number = info->number;
|
|
|
- for (i = 0; i < NF_INET_NUMHOOKS; i++) {
|
|
|
- newinfo->hook_entry[i] = info->hook_entry[i];
|
|
|
- newinfo->underflow[i] = info->underflow[i];
|
|
|
- }
|
|
|
+ /* we dont care about newinfo->entries[] */
|
|
|
+ memcpy(newinfo, info, offsetof(struct xt_table_info, entries));
|
|
|
+ newinfo->initial_entries = 0;
|
|
|
loc_cpu_entry = info->entries[raw_smp_processor_id()];
|
|
|
return IPT_ENTRY_ITERATE(loc_cpu_entry, info->size,
|
|
|
compat_calc_entry, info, loc_cpu_entry, newinfo);
|
|
@@ -1327,8 +1323,7 @@ do_replace(void __user *user, unsigned int len)
|
|
|
return -ENOPROTOOPT;
|
|
|
|
|
|
/* overflow check */
|
|
|
- if (tmp.size >= (INT_MAX - sizeof(struct xt_table_info)) / NR_CPUS -
|
|
|
- SMP_CACHE_BYTES)
|
|
|
+ if (tmp.size >= INT_MAX / num_possible_cpus())
|
|
|
return -ENOMEM;
|
|
|
if (tmp.num_counters >= INT_MAX / sizeof(struct xt_counters))
|
|
|
return -ENOMEM;
|
|
@@ -1868,8 +1863,7 @@ compat_do_replace(void __user *user, unsigned int len)
|
|
|
return -ENOPROTOOPT;
|
|
|
|
|
|
/* overflow check */
|
|
|
- if (tmp.size >= (INT_MAX - sizeof(struct xt_table_info)) / NR_CPUS -
|
|
|
- SMP_CACHE_BYTES)
|
|
|
+ if (tmp.size >= INT_MAX / num_possible_cpus())
|
|
|
return -ENOMEM;
|
|
|
if (tmp.num_counters >= INT_MAX / sizeof(struct xt_counters))
|
|
|
return -ENOMEM;
|
|
@@ -2126,7 +2120,7 @@ int ipt_register_table(struct xt_table *table, const struct ipt_replace *repl)
|
|
|
{
|
|
|
int ret;
|
|
|
struct xt_table_info *newinfo;
|
|
|
- static struct xt_table_info bootstrap
|
|
|
+ struct xt_table_info bootstrap
|
|
|
= { 0, 0, 0, { 0 }, { 0 }, { } };
|
|
|
void *loc_cpu_entry;
|
|
|
|