Commit 7d7d7e02 authored by Florian Westphal's avatar Florian Westphal Committed by Pablo Neira Ayuso

netfilter: compat: reject huge allocation requests

no need to bother even trying to allocating huge compat offset arrays,
such ruleset is rejected later on anyway becaus we refuse to allocate
overly large rule blobs.

However, compat translation happens before blob allocation, so we should
add a check there too.

This is supposed to help with fuzzing by avoiding oom-killer.
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent 9782a11e
...@@ -582,14 +582,8 @@ int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta) ...@@ -582,14 +582,8 @@ int xt_compat_add_offset(u_int8_t af, unsigned int offset, int delta)
{ {
struct xt_af *xp = &xt[af]; struct xt_af *xp = &xt[af];
if (!xp->compat_tab) { if (WARN_ON(!xp->compat_tab))
if (!xp->number) return -ENOMEM;
return -EINVAL;
xp->compat_tab = vmalloc(sizeof(struct compat_delta) * xp->number);
if (!xp->compat_tab)
return -ENOMEM;
xp->cur = 0;
}
if (xp->cur >= xp->number) if (xp->cur >= xp->number)
return -EINVAL; return -EINVAL;
...@@ -634,6 +628,22 @@ EXPORT_SYMBOL_GPL(xt_compat_calc_jump); ...@@ -634,6 +628,22 @@ EXPORT_SYMBOL_GPL(xt_compat_calc_jump);
int xt_compat_init_offsets(u8 af, unsigned int number) int xt_compat_init_offsets(u8 af, unsigned int number)
{ {
size_t mem;
if (!number || number > (INT_MAX / sizeof(struct compat_delta)))
return -EINVAL;
if (WARN_ON(xt[af].compat_tab))
return -EINVAL;
mem = sizeof(struct compat_delta) * number;
if (mem > XT_MAX_TABLE_SIZE)
return -ENOMEM;
xt[af].compat_tab = vmalloc(mem);
if (!xt[af].compat_tab)
return -ENOMEM;
xt[af].number = number; xt[af].number = number;
xt[af].cur = 0; xt[af].cur = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment