mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
netfilter: xtables: check for standard verdicts in policies
This adds the second check that Rusty wanted to have a long time ago. :-) Base chain policies must have absolute verdicts that cease processing in the table, otherwise rule execution may continue in an unexpected spurious fashion (e.g. next chain that follows in memory). Signed-off-by: Jan Engelhardt <[email protected]>
This commit is contained in:
parent
90e7d4ab5c
commit
e2fe35c17f
3 changed files with 57 additions and 6 deletions
|
|
@ -740,6 +740,21 @@ find_check_entry(struct ip6t_entry *e, const char *name, unsigned int size,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static bool check_underflow(struct ip6t_entry *e)
|
||||
{
|
||||
const struct ip6t_entry_target *t;
|
||||
unsigned int verdict;
|
||||
|
||||
if (!unconditional(&e->ipv6))
|
||||
return false;
|
||||
t = ip6t_get_target(e);
|
||||
if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0)
|
||||
return false;
|
||||
verdict = ((struct ip6t_standard_target *)t)->verdict;
|
||||
verdict = -verdict - 1;
|
||||
return verdict == NF_DROP || verdict == NF_ACCEPT;
|
||||
}
|
||||
|
||||
static int
|
||||
check_entry_size_and_hooks(struct ip6t_entry *e,
|
||||
struct xt_table_info *newinfo,
|
||||
|
|
@ -772,8 +787,10 @@ check_entry_size_and_hooks(struct ip6t_entry *e,
|
|||
if ((unsigned char *)e - base == hook_entries[h])
|
||||
newinfo->hook_entry[h] = hook_entries[h];
|
||||
if ((unsigned char *)e - base == underflows[h]) {
|
||||
if (!unconditional(&e->ipv6)) {
|
||||
pr_err("Underflows must be unconditional\n");
|
||||
if (!check_underflow(e)) {
|
||||
pr_err("Underflows must be unconditional and "
|
||||
"use the STANDARD target with "
|
||||
"ACCEPT/DROP\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
newinfo->underflow[h] = underflows[h];
|
||||
|
|
|
|||
Loading…
Reference in a new issue