netfilter: nft_queue: only allow supported familes and hooks
Trying to use 'queue' statement in ingress (for example) triggers a splat on reinject: WARNING: CPU: 3 PID: 1345 at net/netfilter/nf_queue.c:291 ... because nf_reinject cannot find the ruleset head. The netdev family doesn't support async resume at the moment anyway, so disallow loading such rulesets with a more appropriate error message. v2: add 'validate' callback and also check hook points, v1 did allow ingress use in 'table inet', but that doesn't work either. (Pablo) Signed-off-by: Florian Westphal <fw@strlen.de> Reviewed-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
81ea010667
commit
47f4f510ad
@ -68,6 +68,31 @@ static void nft_queue_sreg_eval(const struct nft_expr *expr,
|
|||||||
regs->verdict.code = ret;
|
regs->verdict.code = ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int nft_queue_validate(const struct nft_ctx *ctx,
|
||||||
|
const struct nft_expr *expr,
|
||||||
|
const struct nft_data **data)
|
||||||
|
{
|
||||||
|
static const unsigned int supported_hooks = ((1 << NF_INET_PRE_ROUTING) |
|
||||||
|
(1 << NF_INET_LOCAL_IN) |
|
||||||
|
(1 << NF_INET_FORWARD) |
|
||||||
|
(1 << NF_INET_LOCAL_OUT) |
|
||||||
|
(1 << NF_INET_POST_ROUTING));
|
||||||
|
|
||||||
|
switch (ctx->family) {
|
||||||
|
case NFPROTO_IPV4:
|
||||||
|
case NFPROTO_IPV6:
|
||||||
|
case NFPROTO_INET:
|
||||||
|
case NFPROTO_BRIDGE:
|
||||||
|
break;
|
||||||
|
case NFPROTO_NETDEV: /* lacks okfn */
|
||||||
|
fallthrough;
|
||||||
|
default:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nft_chain_validate_hooks(ctx->chain, supported_hooks);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct nla_policy nft_queue_policy[NFTA_QUEUE_MAX + 1] = {
|
static const struct nla_policy nft_queue_policy[NFTA_QUEUE_MAX + 1] = {
|
||||||
[NFTA_QUEUE_NUM] = { .type = NLA_U16 },
|
[NFTA_QUEUE_NUM] = { .type = NLA_U16 },
|
||||||
[NFTA_QUEUE_TOTAL] = { .type = NLA_U16 },
|
[NFTA_QUEUE_TOTAL] = { .type = NLA_U16 },
|
||||||
@ -164,6 +189,7 @@ static const struct nft_expr_ops nft_queue_ops = {
|
|||||||
.eval = nft_queue_eval,
|
.eval = nft_queue_eval,
|
||||||
.init = nft_queue_init,
|
.init = nft_queue_init,
|
||||||
.dump = nft_queue_dump,
|
.dump = nft_queue_dump,
|
||||||
|
.validate = nft_queue_validate,
|
||||||
.reduce = NFT_REDUCE_READONLY,
|
.reduce = NFT_REDUCE_READONLY,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -173,6 +199,7 @@ static const struct nft_expr_ops nft_queue_sreg_ops = {
|
|||||||
.eval = nft_queue_sreg_eval,
|
.eval = nft_queue_sreg_eval,
|
||||||
.init = nft_queue_sreg_init,
|
.init = nft_queue_sreg_init,
|
||||||
.dump = nft_queue_sreg_dump,
|
.dump = nft_queue_sreg_dump,
|
||||||
|
.validate = nft_queue_validate,
|
||||||
.reduce = NFT_REDUCE_READONLY,
|
.reduce = NFT_REDUCE_READONLY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user