|
@@ -658,29 +658,23 @@ EXPORT_SYMBOL_GPL(xt_compat_target_to_user);
|
|
|
|
|
|
|
|
struct xt_table_info *xt_alloc_table_info(unsigned int size)
|
|
struct xt_table_info *xt_alloc_table_info(unsigned int size)
|
|
|
{
|
|
{
|
|
|
- struct xt_table_info *newinfo;
|
|
|
|
|
|
|
+ struct xt_table_info *info = NULL;
|
|
|
|
|
+ size_t sz = sizeof(*info) + size;
|
|
|
|
|
|
|
|
/* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
|
|
/* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
|
|
|
if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
|
|
if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
|
|
|
return NULL;
|
|
return NULL;
|
|
|
|
|
|
|
|
- newinfo = kzalloc(XT_TABLE_INFO_SZ, GFP_KERNEL);
|
|
|
|
|
- if (!newinfo)
|
|
|
|
|
- return NULL;
|
|
|
|
|
-
|
|
|
|
|
- newinfo->size = size;
|
|
|
|
|
-
|
|
|
|
|
- if (size <= PAGE_SIZE)
|
|
|
|
|
- newinfo->entries = kmalloc(size, GFP_KERNEL);
|
|
|
|
|
- else
|
|
|
|
|
- newinfo->entries = vmalloc(size);
|
|
|
|
|
-
|
|
|
|
|
- if (newinfo->entries == NULL) {
|
|
|
|
|
- xt_free_table_info(newinfo);
|
|
|
|
|
- return NULL;
|
|
|
|
|
|
|
+ if (sz <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER))
|
|
|
|
|
+ info = kmalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_NORETRY);
|
|
|
|
|
+ if (!info) {
|
|
|
|
|
+ info = vmalloc(sz);
|
|
|
|
|
+ if (!info)
|
|
|
|
|
+ return NULL;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- return newinfo;
|
|
|
|
|
|
|
+ memset(info, 0, sizeof(*info));
|
|
|
|
|
+ info->size = size;
|
|
|
|
|
+ return info;
|
|
|
}
|
|
}
|
|
|
EXPORT_SYMBOL(xt_alloc_table_info);
|
|
EXPORT_SYMBOL(xt_alloc_table_info);
|
|
|
|
|
|
|
@@ -688,8 +682,6 @@ void xt_free_table_info(struct xt_table_info *info)
|
|
|
{
|
|
{
|
|
|
int cpu;
|
|
int cpu;
|
|
|
|
|
|
|
|
- kvfree(info->entries);
|
|
|
|
|
-
|
|
|
|
|
if (info->jumpstack != NULL) {
|
|
if (info->jumpstack != NULL) {
|
|
|
for_each_possible_cpu(cpu)
|
|
for_each_possible_cpu(cpu)
|
|
|
kvfree(info->jumpstack[cpu]);
|
|
kvfree(info->jumpstack[cpu]);
|
|
@@ -698,7 +690,7 @@ void xt_free_table_info(struct xt_table_info *info)
|
|
|
|
|
|
|
|
free_percpu(info->stackptr);
|
|
free_percpu(info->stackptr);
|
|
|
|
|
|
|
|
- kfree(info);
|
|
|
|
|
|
|
+ kvfree(info);
|
|
|
}
|
|
}
|
|
|
EXPORT_SYMBOL(xt_free_table_info);
|
|
EXPORT_SYMBOL(xt_free_table_info);
|
|
|
|
|
|