mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
netfilter: nf_tables: use DEBUG_NET_WARN_ON_ONCE in packet and control paths
Replace raw warning macros with DEBUG_NET_WARN_ON_ONCE across the nf_tables API, core engine, and expression evaluations. This prevents unnecessary system panics when panic_on_warn=1 is enabled in production systems. Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
committed by
Pablo Neira Ayuso
parent
30877f3da9
commit
42eb1ca711
@@ -3378,8 +3378,10 @@ static int nf_tables_delchain(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
*/
|
||||
int nft_register_expr(struct nft_expr_type *type)
|
||||
{
|
||||
if (WARN_ON_ONCE(type->maxattr > NFT_EXPR_MAXATTR))
|
||||
if (unlikely(type->maxattr > NFT_EXPR_MAXATTR)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
nfnl_lock(NFNL_SUBSYS_NFTABLES);
|
||||
if (type->family == NFPROTO_UNSPEC)
|
||||
@@ -3691,8 +3693,10 @@ int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src, gfp_t gfp)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (WARN_ON_ONCE(!src->ops->clone))
|
||||
if (unlikely(!src->ops->clone)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dst->ops = src->ops;
|
||||
err = src->ops->clone(dst, src, gfp);
|
||||
@@ -8327,8 +8331,10 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
return 0;
|
||||
|
||||
type = nft_obj_type_get(net, objtype, family);
|
||||
if (WARN_ON_ONCE(IS_ERR(type)))
|
||||
if (IS_ERR(type)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return PTR_ERR(type);
|
||||
}
|
||||
|
||||
nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
|
||||
|
||||
@@ -10306,19 +10312,25 @@ static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *cha
|
||||
|
||||
prule = (struct nft_rule_dp *)data;
|
||||
data += offsetof(struct nft_rule_dp, data);
|
||||
if (WARN_ON_ONCE(data > data_boundary))
|
||||
if (unlikely(data > data_boundary)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
size = 0;
|
||||
nft_rule_for_each_expr(expr, last, rule) {
|
||||
if (WARN_ON_ONCE(data + size + expr->ops->size > data_boundary))
|
||||
if (unlikely(data + size + expr->ops->size > data_boundary)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(data + size, expr, expr->ops->size);
|
||||
size += expr->ops->size;
|
||||
}
|
||||
if (WARN_ON_ONCE(size >= 1 << 12))
|
||||
if (unlikely(size >= 1 << 12)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
prule->handle = rule->handle;
|
||||
prule->dlen = size;
|
||||
@@ -10329,8 +10341,10 @@ static int nf_tables_commit_chain_prepare(struct net *net, struct nft_chain *cha
|
||||
chain->blob_next->size += (unsigned long)(data - (void *)prule);
|
||||
}
|
||||
|
||||
if (WARN_ON_ONCE(data > data_boundary))
|
||||
if (unlikely(data > data_boundary)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
prule = (struct nft_rule_dp *)data;
|
||||
nft_last_rule(chain, prule);
|
||||
@@ -11636,8 +11650,10 @@ int nft_parse_register_load(const struct nft_ctx *ctx,
|
||||
next_register = DIV_ROUND_UP(len, NFT_REG32_SIZE) + reg;
|
||||
|
||||
/* Can't happen: nft_validate_register_load() should have failed */
|
||||
if (WARN_ON_ONCE(next_register > NFT_REG32_NUM))
|
||||
if (unlikely(next_register > NFT_REG32_NUM)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* find first register that did not see an earlier store. */
|
||||
invalid_reg = find_next_zero_bit(ctx->reg_inited, NFT_REG32_NUM, reg);
|
||||
@@ -11884,8 +11900,10 @@ int nft_data_init(const struct nft_ctx *ctx, struct nft_data *data,
|
||||
struct nlattr *tb[NFTA_DATA_MAX + 1];
|
||||
int err;
|
||||
|
||||
if (WARN_ON_ONCE(!desc->size))
|
||||
if (unlikely(!desc->size)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = nla_parse_nested_deprecated(tb, NFTA_DATA_MAX, nla,
|
||||
nft_data_policy, NULL);
|
||||
@@ -11950,7 +11968,7 @@ int nft_data_dump(struct sk_buff *skb, int attr, const struct nft_data *data,
|
||||
break;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
WARN_ON(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
}
|
||||
|
||||
nla_nest_end(skb, nest);
|
||||
|
||||
@@ -314,8 +314,10 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)
|
||||
|
||||
switch (regs.verdict.code) {
|
||||
case NFT_JUMP:
|
||||
if (WARN_ON_ONCE(stackptr >= NFT_JUMP_STACK_SIZE))
|
||||
return NF_DROP;
|
||||
if (unlikely(stackptr >= NFT_JUMP_STACK_SIZE)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return NF_DROP_REASON(pkt->skb, SKB_DROP_REASON_NETFILTER_DROP, ELOOP);
|
||||
}
|
||||
jumpstack[stackptr].rule = nft_rule_next(rule);
|
||||
stackptr++;
|
||||
fallthrough;
|
||||
@@ -326,7 +328,7 @@ nft_do_chain(struct nft_pktinfo *pkt, void *priv)
|
||||
case NFT_RETURN:
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
}
|
||||
|
||||
if (stackptr > 0) {
|
||||
|
||||
@@ -361,7 +361,7 @@ static int nft_block_setup(struct nft_base_chain *basechain,
|
||||
err = nft_flow_offload_unbind(bo, basechain);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
err = -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
|
||||
@@ -227,8 +227,10 @@ static const struct nft_chain *nft_trace_get_chain(const struct nft_rule_dp *rul
|
||||
|
||||
last = (const struct nft_rule_dp_last *)rule;
|
||||
|
||||
if (WARN_ON_ONCE(!last->chain))
|
||||
if (unlikely(!last->chain)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return &info->basechain->chain;
|
||||
}
|
||||
|
||||
return last->chain;
|
||||
}
|
||||
@@ -354,7 +356,7 @@ void nft_trace_notify(const struct nft_pktinfo *pkt,
|
||||
return;
|
||||
|
||||
nla_put_failure:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
|
||||
@@ -1132,7 +1132,7 @@ static void nft_ct_helper_obj_eval(struct nft_object *obj,
|
||||
to_assign = priv->helper6;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ void nft_ct_get_fast_eval(const struct nft_expr *expr,
|
||||
return;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -298,7 +298,7 @@ static void nft_exthdr_tcp_set_eval(const struct nft_expr *expr,
|
||||
old.v32, new.v32, false);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -155,7 +155,7 @@ void nft_fib_store_result(void *reg, const struct nft_fib *priv,
|
||||
strscpy_pad(reg, dev ? dev->name : "", IFNAMSIZ);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
*dreg = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ static void nft_inner_eval(const struct nft_expr *expr, struct nft_regs *regs,
|
||||
nft_meta_inner_eval((struct nft_expr *)&priv->expr, regs, pkt, &tun_ctx);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
nft_inner_save_tun_ctx(pkt, &tun_ctx);
|
||||
|
||||
@@ -50,7 +50,7 @@ __nft_set_do_lookup(const struct net *net, const struct nft_set *set,
|
||||
if (set->ops == &nft_set_rbtree_type.ops)
|
||||
return nft_rbtree_lookup(net, set, key);
|
||||
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
#endif
|
||||
return set->ops->lookup(net, set, key);
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ static void nft_masq_eval(const struct nft_expr *expr,
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,12 +116,12 @@ nft_meta_get_eval_pkttype_lo(const struct nft_pktinfo *pkt,
|
||||
nft_reg_store8(dest, PACKET_MULTICAST);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -460,7 +460,7 @@ void nft_meta_get_eval(const struct nft_expr *expr,
|
||||
nft_meta_get_eval_sdifname(dest, pkt);
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
return;
|
||||
@@ -506,7 +506,7 @@ void nft_meta_set_eval(const struct nft_expr *expr,
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(nft_meta_set_eval);
|
||||
@@ -886,7 +886,7 @@ void nft_meta_inner_eval(const struct nft_expr *expr,
|
||||
nft_reg_store8(dest, tun_ctx->l4proto);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -196,7 +196,7 @@ void nft_payload_eval(const struct nft_expr *expr,
|
||||
goto err;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
offset += priv->offset;
|
||||
@@ -603,7 +603,7 @@ void nft_payload_inner_eval(const struct nft_expr *expr, struct nft_regs *regs,
|
||||
offset = tun_ctx->inner_thoff;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
offset += priv->offset;
|
||||
@@ -866,7 +866,7 @@ static void nft_payload_set_eval(const struct nft_expr *expr,
|
||||
goto err;
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ static void nft_redir_eval(const struct nft_expr *expr,
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,8 +102,10 @@ static u8 icmp_code_v4[NFT_REJECT_ICMPX_MAX + 1] = {
|
||||
|
||||
int nft_reject_icmp_code(u8 code)
|
||||
{
|
||||
if (WARN_ON_ONCE(code > NFT_REJECT_ICMPX_MAX))
|
||||
if (unlikely(code > NFT_REJECT_ICMPX_MAX)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return ICMP_NET_UNREACH;
|
||||
}
|
||||
|
||||
return icmp_code_v4[code];
|
||||
}
|
||||
@@ -120,8 +122,10 @@ static u8 icmp_code_v6[NFT_REJECT_ICMPX_MAX + 1] = {
|
||||
|
||||
int nft_reject_icmpv6_code(u8 code)
|
||||
{
|
||||
if (WARN_ON_ONCE(code > NFT_REJECT_ICMPX_MAX))
|
||||
if (unlikely(code > NFT_REJECT_ICMPX_MAX)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return ICMPV6_NOROUTE;
|
||||
}
|
||||
|
||||
return icmp_code_v6[code];
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ void nft_rt_get_eval(const struct nft_expr *expr,
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
goto err;
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -385,7 +385,7 @@ static void nft_rhash_walk(const struct nft_ctx *ctx, struct nft_set *set,
|
||||
break;
|
||||
default:
|
||||
iter->err = -EINVAL;
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2199,7 +2199,7 @@ static void nft_pipapo_walk(const struct nft_ctx *ctx, struct nft_set *set,
|
||||
break;
|
||||
default:
|
||||
iter->err = -EINVAL;
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -654,8 +654,10 @@ static int nft_array_may_resize(const struct nft_set *set, bool flush)
|
||||
}
|
||||
|
||||
realloc_array:
|
||||
if (WARN_ON_ONCE(nelems > new_max_intervals))
|
||||
if (unlikely(nelems > new_max_intervals)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (priv->array_next) {
|
||||
if (max_intervals == new_max_intervals)
|
||||
@@ -878,7 +880,7 @@ static void nft_rbtree_walk(const struct nft_ctx *ctx,
|
||||
break;
|
||||
default:
|
||||
iter->err = -EINVAL;
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,8 +71,10 @@ static noinline int nft_socket_cgroup_subtree_level(void)
|
||||
if (level > 255)
|
||||
return -ERANGE;
|
||||
|
||||
if (WARN_ON_ONCE(level < 0))
|
||||
if (unlikely(level < 0)) {
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return level;
|
||||
}
|
||||
@@ -97,7 +99,7 @@ static struct sock *nft_socket_do_lookup(const struct nft_pktinfo *pkt)
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -152,7 +154,7 @@ static void nft_socket_eval(const struct nft_expr *expr,
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
WARN_ON(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ static void nft_tunnel_get_eval(const struct nft_expr *expr,
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ static void nft_xfrm_state_get_key(const struct nft_xfrm *priv,
|
||||
switch (priv->key) {
|
||||
case NFT_XFRM_KEY_UNSPEC:
|
||||
case __NFT_XFRM_KEY_MAX:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
break;
|
||||
case NFT_XFRM_KEY_DADDR_IP4:
|
||||
*dest = (__force __u32)state->id.daddr.a4;
|
||||
@@ -206,7 +206,7 @@ static void nft_xfrm_get_eval(const struct nft_expr *expr,
|
||||
nft_xfrm_get_eval_out(priv, regs, pkt);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
regs->verdict.code = NFT_BREAK;
|
||||
break;
|
||||
}
|
||||
@@ -252,7 +252,7 @@ static int nft_xfrm_validate(const struct nft_ctx *ctx, const struct nft_expr *e
|
||||
(1 << NF_INET_POST_ROUTING);
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
DEBUG_NET_WARN_ON_ONCE(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user