FAILED: patch "[PATCH] netfilter: nft_fib: reject fib expression on the netdev" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x d07955dd34ecae17d35d8c7d0a273a3fba653a8c
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026072054-refresh-tumble-391b@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From d07955dd34ecae17d35d8c7d0a273a3fba653a8c Mon Sep 17 00:00:00 2001
From: Theodor Arsenij Larionov-Trichkine <[email protected]>
Date: Mon, 29 Jun 2026 12:53:11 +0200
Subject: [PATCH] netfilter: nft_fib: reject fib expression on the netdev
egress hook
A fib expression in a netdev egress base chain dereferences nft_in(pkt), NULL on the transmit path, causing a NULL pointer dereference at eval. nft_fib_validate() masks the hook with NF_INET_* values, but netdev hook numbers are a separate enum that aliases them (NF_NETDEV_EGRESS == NF_INET_LOCAL_IN), so an egress chain passes validation and then faults.
Add nft_fib_netdev_validate() that limits each result/flag to the netdev hook where the device it reads exists: the input-device cases (OIF, OIFNAME, ADDRTYPE with F_IIF) to ingress, the output-device case (ADDRTYPE with F_OIF) to egress, ADDRTYPE with no device flag to both. Also restrict nft_fib_validate() to NFPROTO_IPV4/IPV6/INET so its NF_INET_* masks are not applied to another family's hooks.
net/netfilter/nft_fib.c +9 -0
@@ -31,6 +31,15 @@ int nft_fib_validate(const struct nft_ctx *ctx, const struct nft_expr *expr)const struct nft_fib *priv =nft_expr_priv (expr);unsigned int hooks; +switch (ctx->family) { +case NFPROTO_IPV4 : +case NFPROTO_IPV6 : +case NFPROTO_INET : +break ; +default : +return -EOPNOTSUPP ; + } +switch (priv->result) {case NFT_FIB_RESULT_OIF :case NFT_FIB_RESULT_OIFNAME :
net/netfilter/nft_fib_netdev.c +28 -1
@@ -50,6 +50,33 @@ static void nft_fib_netdev_eval(const struct nft_expr *expr, regs->verdict.code =NFT_BREAK ; } +static int nft_fib_netdev_validate (const struct nft_ctx *ctx, +const struct nft_expr *expr) +{ +const struct nft_fib *priv =nft_expr_priv (expr); +unsigned int hooks; + +switch (priv->result) { +case NFT_FIB_RESULT_OIF : +case NFT_FIB_RESULT_OIFNAME : + hooks = (1 <<NF_NETDEV_INGRESS ); +break ; +case NFT_FIB_RESULT_ADDRTYPE : +if (priv->flags &NFTA_FIB_F_IIF ) + hooks = (1 <<NF_NETDEV_INGRESS ); +else if (priv->flags &NFTA_FIB_F_OIF ) + hooks = (1 <<NF_NETDEV_EGRESS ); +else + hooks = (1 <<NF_NETDEV_INGRESS ) | + (1 <<NF_NETDEV_EGRESS ); +break ; +default : +return -EINVAL ; + } + +return nft_chain_validate_hooks (ctx->chain, hooks); +} +static struct nft_expr_type nft_fib_netdev_type;static const struct nft_expr_ops nft_fib_netdev_ops = { .type = &nft_fib_netdev_type,
@@ -57,7 +84,7 @@ static const struct nft_expr_ops nft_fib_netdev_ops = { .eval = nft_fib_netdev_eval, .init = nft_fib_init, .dump = nft_fib_dump, - .validate = nft_fib_validate, + .validate = nft_fib_netdev_validate, };static struct nft_expr_type nft_fib_netdev_type__read_mostly = {
Sasha Levin
maintainerPATCH 1/7 netfilter: nf_tables: pass context structure to nft_parse_register_load
From: Florian Westphal <[email protected]>
[ Upstream commit 7ea0522ef81a335c2d3a0ab1c8a4fab9a23c4a03 ]
Mechanical transformation, no logical changes intended.
Stable-dep-of: d07955dd34ec ("netfilter: nft_fib: reject fib expression on the netdev egress hook")
--- include/net/netfilter/nf_tables.h | 3 ++- net/ipv4/netfilter/nft_dup_ipv4.c | 4 ++-- net/ipv6/netfilter/nft_dup_ipv6.c | 4 ++-- net/netfilter/nf_tables_api.c | 3 ++- net/netfilter/nft_bitwise.c | 4 ++-- net/netfilter/nft_byteorder.c | 2 +- net/netfilter/nft_cmp.c | 6 +++--- net/netfilter/nft_ct.c | 2 +- net/netfilter/nft_dup_netdev.c | 2 +- net/netfilter/nft_dynset.c | 4 ++-- net/netfilter/nft_exthdr.c | 2 +- net/netfilter/nft_fwd_netdev.c | 6 +++--- net/netfilter/nft_hash.c | 2 +- net/netfilter/nft_lookup.c | 2 +- net/netfilter/nft_masq.c | 4 ++-- net/netfilter/nft_meta.c | 2 +- net/netfilter/nft_nat.c | 8 ++++---- net/netfilter/nft_objref.c | 2 +- net/netfilter/nft_payload.c | 2 +- net/netfilter/nft_queue.c | 2 +- net/netfilter/nft_range.c | 2 +- net/netfilter/nft_redir.c | 4 ++-- net/netfilter/nft_tproxy.c | 4 ++-- 23 files changed, 39 insertions(+), 37 deletions(-)
include/net/netfilter/nf_tables.h +2 -1
@@ -252,7 +252,8 @@ static inline enum nft_registers nft_type_to_reg(enum nft_data_types type)int nft_parse_u32_check (const struct nlattr *attr,int max,u32 *dest);int nft_dump_register (struct sk_buff *skb,unsigned int attr,unsigned int reg); -int nft_parse_register_load (const struct nlattr *attr,u8 *sreg,u32 len); +int nft_parse_register_load (const struct nft_ctx *ctx, +const struct nlattr *attr,u8 *sreg,u32 len); int nft_parse_register_store(const struct nft_ctx *ctx, const struct nlattr *attr, u8 *dreg, const struct nft_data *data,
net/ipv4/netfilter/nft_dup_ipv4.c +2 -2
@@ -40,13 +40,13 @@ static int nft_dup_ipv4_init(const struct nft_ctx *ctx,if (tb[NFTA_DUP_SREG_ADDR ] ==NULL )return -EINVAL ; - err =nft_parse_register_load (tb[NFTA_DUP_SREG_ADDR ], &priv->sreg_addr, + err =nft_parse_register_load (ctx, tb[NFTA_DUP_SREG_ADDR ], &priv->sreg_addr,sizeof (struct in_addr ));if (err <0 )return err;if (tb[NFTA_DUP_SREG_DEV ]) - err =nft_parse_register_load (tb[NFTA_DUP_SREG_DEV ], + err =nft_parse_register_load (ctx, tb[NFTA_DUP_SREG_DEV ], &priv->sreg_dev,sizeof (int ));return err;
net/ipv6/netfilter/nft_dup_ipv6.c +2 -2
@@ -38,13 +38,13 @@ static int nft_dup_ipv6_init(const struct nft_ctx *ctx,if (tb[NFTA_DUP_SREG_ADDR ] ==NULL )return -EINVAL ; - err =nft_parse_register_load (tb[NFTA_DUP_SREG_ADDR ], &priv->sreg_addr, + err =nft_parse_register_load (ctx, tb[NFTA_DUP_SREG_ADDR ], &priv->sreg_addr,sizeof (struct in6_addr ));if (err <0 )return err;if (tb[NFTA_DUP_SREG_DEV ]) - err =nft_parse_register_load (tb[NFTA_DUP_SREG_DEV ], + err =nft_parse_register_load (ctx, tb[NFTA_DUP_SREG_DEV ], &priv->sreg_dev,sizeof (int ));return err;
net/netfilter/nf_tables_api.c +2 -1
@@ -10442,7 +10442,8 @@ static int nft_validate_register_load(enum nft_registers reg, unsigned int len)return 0 ; } -int nft_parse_register_load (const struct nlattr *attr,u8 *sreg,u32 len) +int nft_parse_register_load (const struct nft_ctx *ctx, +const struct nlattr *attr,u8 *sreg,u32 len) {u32 reg;int err;
net/netfilter/nft_bitwise.c +2 -2
@@ -172,7 +172,7 @@ static int nft_bitwise_init(const struct nft_ctx *ctx, priv->len = len; - err =nft_parse_register_load (tb[NFTA_BITWISE_SREG ], &priv->sreg, + err =nft_parse_register_load (ctx, tb[NFTA_BITWISE_SREG ], &priv->sreg, priv->len);if (err <0 )return err;
@@ -365,7 +365,7 @@ static int nft_bitwise_fast_init(const struct nft_ctx *ctx,struct nft_bitwise_fast_expr *priv =nft_expr_priv (expr);int err; - err =nft_parse_register_load (tb[NFTA_BITWISE_SREG ], &priv->sreg, + err =nft_parse_register_load (ctx, tb[NFTA_BITWISE_SREG ], &priv->sreg,sizeof (u32));if (err <0 )return err;
net/netfilter/nft_byteorder.c +1 -1
@@ -139,7 +139,7 @@ static int nft_byteorder_init(const struct nft_ctx *ctx, priv->len = len; - err =nft_parse_register_load (tb[NFTA_BYTEORDER_SREG ], &priv->sreg, + err =nft_parse_register_load (ctx, tb[NFTA_BYTEORDER_SREG ], &priv->sreg, priv->len);if (err <0 )return err;
net/netfilter/nft_cmp.c +3 -3
@@ -83,7 +83,7 @@ static int nft_cmp_init(const struct nft_ctx *ctx, const struct nft_expr *expr,if (err <0 )return err; - err =nft_parse_register_load (tb[NFTA_CMP_SREG ], &priv->sreg, desc.len); + err =nft_parse_register_load (ctx, tb[NFTA_CMP_SREG ], &priv->sreg, desc.len);if (err <0 )return err;
@@ -221,7 +221,7 @@ static int nft_cmp_fast_init(const struct nft_ctx *ctx,if (err <0 )return err; - err =nft_parse_register_load (tb[NFTA_CMP_SREG ], &priv->sreg, desc.len); + err =nft_parse_register_load (ctx, tb[NFTA_CMP_SREG ], &priv->sreg, desc.len);if (err <0 )return err;
@@ -321,7 +321,7 @@ static int nft_cmp16_fast_init(const struct nft_ctx *ctx,if (err <0 )return err; - err =nft_parse_register_load (tb[NFTA_CMP_SREG ], &priv->sreg, desc.len); + err =nft_parse_register_load (ctx, tb[NFTA_CMP_SREG ], &priv->sreg, desc.len);if (err <0 )return err;
net/netfilter/nft_ct.c +1 -1
@@ -621,7 +621,7 @@ static int nft_ct_set_init(const struct nft_ctx *ctx, } priv->len = len; - err =nft_parse_register_load (tb[NFTA_CT_SREG ], &priv->sreg, len); + err =nft_parse_register_load (ctx, tb[NFTA_CT_SREG ], &priv->sreg, len);if (err <0 ) goto err1;
net/netfilter/nft_dup_netdev.c +1 -1
@@ -40,7 +40,7 @@ static int nft_dup_netdev_init(const struct nft_ctx *ctx,if (tb[NFTA_DUP_SREG_DEV ] ==NULL )return -EINVAL ; -return nft_parse_register_load (tb[NFTA_DUP_SREG_DEV ], &priv->sreg_dev, +return nft_parse_register_load (ctx, tb[NFTA_DUP_SREG_DEV ], &priv->sreg_dev,sizeof (int )); }
net/netfilter/nft_dynset.c +2 -2
@@ -222,7 +222,7 @@ static int nft_dynset_init(const struct nft_ctx *ctx,return err; } - err =nft_parse_register_load (tb[NFTA_DYNSET_SREG_KEY ], &priv->sreg_key, + err =nft_parse_register_load (ctx, tb[NFTA_DYNSET_SREG_KEY ], &priv->sreg_key, set->klen);if (err <0 )return err;
@@ -233,7 +233,7 @@ static int nft_dynset_init(const struct nft_ctx *ctx,if (set->dtype ==NFT_DATA_VERDICT )return -EOPNOTSUPP ; - err =nft_parse_register_load (tb[NFTA_DYNSET_SREG_DATA ], + err =nft_parse_register_load (ctx, tb[NFTA_DYNSET_SREG_DATA ], &priv->sreg_data, set->dlen);if (err <0 )return err;
net/netfilter/nft_exthdr.c +1 -1
@@ -590,7 +590,7 @@ static int nft_exthdr_tcp_set_init(const struct nft_ctx *ctx, priv->flags = flags; priv->op = op; -return nft_parse_register_load (tb[NFTA_EXTHDR_SREG ], &priv->sreg, +return nft_parse_register_load (ctx, tb[NFTA_EXTHDR_SREG ], &priv->sreg, priv->len); }
net/netfilter/nft_fwd_netdev.c +3 -3
@@ -52,7 +52,7 @@ static int nft_fwd_netdev_init(const struct nft_ctx *ctx,if (tb[NFTA_FWD_SREG_DEV ] ==NULL )return -EINVAL ; -return nft_parse_register_load (tb[NFTA_FWD_SREG_DEV ], &priv->sreg_dev, +return nft_parse_register_load (ctx, tb[NFTA_FWD_SREG_DEV ], &priv->sreg_dev,sizeof (int )); }
@@ -187,12 +187,12 @@ static int nft_fwd_neigh_init(const struct nft_ctx *ctx,return -EOPNOTSUPP ; } - err =nft_parse_register_load (tb[NFTA_FWD_SREG_DEV ], &priv->sreg_dev, + err =nft_parse_register_load (ctx, tb[NFTA_FWD_SREG_DEV ], &priv->sreg_dev,sizeof (int ));if (err <0 )return err; -return nft_parse_register_load (tb[NFTA_FWD_SREG_ADDR ], &priv->sreg_addr, +return nft_parse_register_load (ctx, tb[NFTA_FWD_SREG_ADDR ], &priv->sreg_addr, addr_len); }
net/netfilter/nft_hash.c +1 -1
@@ -91,7 +91,7 @@ static int nft_jhash_init(const struct nft_ctx *ctx, priv->len = len; - err =nft_parse_register_load (tb[NFTA_HASH_SREG ], &priv->sreg, len); + err =nft_parse_register_load (ctx, tb[NFTA_HASH_SREG ], &priv->sreg, len);if (err <0 )return err;
net/netfilter/nft_lookup.c +1 -1
@@ -111,7 +111,7 @@ static int nft_lookup_init(const struct nft_ctx *ctx,if (IS_ERR (set))return PTR_ERR (set); - err =nft_parse_register_load (tb[NFTA_LOOKUP_SREG ], &priv->sreg, + err =nft_parse_register_load (ctx, tb[NFTA_LOOKUP_SREG ], &priv->sreg, set->klen);if (err <0 )return err;
net/netfilter/nft_masq.c +2 -2
@@ -54,13 +54,13 @@ static int nft_masq_init(const struct nft_ctx *ctx, }if (tb[NFTA_MASQ_REG_PROTO_MIN ]) { - err =nft_parse_register_load (tb[NFTA_MASQ_REG_PROTO_MIN ], + err =nft_parse_register_load (ctx, tb[NFTA_MASQ_REG_PROTO_MIN ], &priv->sreg_proto_min, plen);if (err <0 )return err;if (tb[NFTA_MASQ_REG_PROTO_MAX ]) { - err =nft_parse_register_load (tb[NFTA_MASQ_REG_PROTO_MAX ], + err =nft_parse_register_load (ctx, tb[NFTA_MASQ_REG_PROTO_MAX ], &priv->sreg_proto_max, plen);if (err <0 )
net/netfilter/nft_meta.c +1 -1
@@ -657,7 +657,7 @@ int nft_meta_set_init(const struct nft_ctx *ctx, } priv->len = len; - err =nft_parse_register_load (tb[NFTA_META_SREG ], &priv->sreg, len); + err =nft_parse_register_load (ctx, tb[NFTA_META_SREG ], &priv->sreg, len);if (err <0 )return err;
net/netfilter/nft_nat.c +4 -4
@@ -213,13 +213,13 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, priv->family = family;if (tb[NFTA_NAT_REG_ADDR_MIN ]) { - err =nft_parse_register_load (tb[NFTA_NAT_REG_ADDR_MIN ], + err =nft_parse_register_load (ctx, tb[NFTA_NAT_REG_ADDR_MIN ], &priv->sreg_addr_min, alen);if (err <0 )return err;if (tb[NFTA_NAT_REG_ADDR_MAX ]) { - err =nft_parse_register_load (tb[NFTA_NAT_REG_ADDR_MAX ], + err =nft_parse_register_load (ctx, tb[NFTA_NAT_REG_ADDR_MAX ], &priv->sreg_addr_max, alen);if (err <0 )
@@ -233,13 +233,13 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, plen = sizeof_field(struct nf_nat_range, min_proto.all);if (tb[NFTA_NAT_REG_PROTO_MIN ]) { - err =nft_parse_register_load (tb[NFTA_NAT_REG_PROTO_MIN ], + err =nft_parse_register_load (ctx, tb[NFTA_NAT_REG_PROTO_MIN ], &priv->sreg_proto_min, plen);if (err <0 )return err;if (tb[NFTA_NAT_REG_PROTO_MAX ]) { - err =nft_parse_register_load (tb[NFTA_NAT_REG_PROTO_MAX ], + err =nft_parse_register_load (ctx, tb[NFTA_NAT_REG_PROTO_MAX ], &priv->sreg_proto_max, plen);if (err <0 )
net/netfilter/nft_objref.c +1 -1
@@ -143,7 +143,7 @@ static int nft_objref_map_init(const struct nft_ctx *ctx,if (!(set->flags &NFT_SET_OBJECT ))return -EINVAL ; - err =nft_parse_register_load (tb[NFTA_OBJREF_SET_SREG ], &priv->sreg, + err =nft_parse_register_load (ctx, tb[NFTA_OBJREF_SET_SREG ], &priv->sreg, set->klen);if (err <0 )return err;
net/netfilter/nft_payload.c +1 -1
@@ -857,7 +857,7 @@ static int nft_payload_set_init(const struct nft_ctx *ctx, } priv->csum_type = csum_type; -return nft_parse_register_load (tb[NFTA_PAYLOAD_SREG ], &priv->sreg, +return nft_parse_register_load (ctx, tb[NFTA_PAYLOAD_SREG ], &priv->sreg, priv->len); }
net/netfilter/nft_queue.c +1 -1
@@ -136,7 +136,7 @@ static int nft_queue_sreg_init(const struct nft_ctx *ctx,struct nft_queue *priv =nft_expr_priv (expr);int err; - err =nft_parse_register_load (tb[NFTA_QUEUE_SREG_QNUM ], + err =nft_parse_register_load (ctx, tb[NFTA_QUEUE_SREG_QNUM ], &priv->sreg_qnum,sizeof (u32));if (err <0 )return err;
net/netfilter/nft_range.c +1 -1
@@ -83,7 +83,7 @@ static int nft_range_init(const struct nft_ctx *ctx, const struct nft_expr *expr goto err2; } - err =nft_parse_register_load (tb[NFTA_RANGE_SREG ], &priv->sreg, + err =nft_parse_register_load (ctx, tb[NFTA_RANGE_SREG ], &priv->sreg, desc_from.len);if (err <0 ) goto err2;
net/netfilter/nft_redir.c +2 -2
@@ -50,13 +50,13 @@ static int nft_redir_init(const struct nft_ctx *ctx, plen = sizeof_field(struct nf_nat_range, min_proto.all);if (tb[NFTA_REDIR_REG_PROTO_MIN ]) { - err =nft_parse_register_load (tb[NFTA_REDIR_REG_PROTO_MIN ], + err =nft_parse_register_load (ctx, tb[NFTA_REDIR_REG_PROTO_MIN ], &priv->sreg_proto_min, plen);if (err <0 )return err;if (tb[NFTA_REDIR_REG_PROTO_MAX ]) { - err =nft_parse_register_load (tb[NFTA_REDIR_REG_PROTO_MAX ], + err =nft_parse_register_load (ctx, tb[NFTA_REDIR_REG_PROTO_MAX ], &priv->sreg_proto_max, plen);if (err <0 )
net/netfilter/nft_tproxy.c +2 -2
@@ -254,14 +254,14 @@ static int nft_tproxy_init(const struct nft_ctx *ctx, }if (tb[NFTA_TPROXY_REG_ADDR ]) { - err =nft_parse_register_load (tb[NFTA_TPROXY_REG_ADDR ], + err =nft_parse_register_load (ctx, tb[NFTA_TPROXY_REG_ADDR ], &priv->sreg_addr, alen);if (err <0 )return err; }if (tb[NFTA_TPROXY_REG_PORT ]) { - err =nft_parse_register_load (tb[NFTA_TPROXY_REG_PORT ], + err =nft_parse_register_load (ctx, tb[NFTA_TPROXY_REG_PORT ], &priv->sreg_port,sizeof (u16));if (err <0 )return err;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/7 netfilter: nf_tables: drop unused 3rd argument from validate callback ops
From: Florian Westphal <[email protected]>
[ Upstream commit eaf9b2c875ece22768b78aa38da8b232e5de021b ]
Since commit a654de8fdc18 ("netfilter: nf_tables: fix chain dependency validation") the validate() callback no longer needs the return pointer argument.
Stable-dep-of: d07955dd34ec ("netfilter: nft_fib: reject fib expression on the netdev egress hook")
--- include/net/netfilter/nf_tables.h | 3 +-- include/net/netfilter/nft_fib.h | 4 +--- include/net/netfilter/nft_meta.h | 3 +-- include/net/netfilter/nft_reject.h | 3 +-- net/bridge/netfilter/nft_reject_bridge.c | 3 +-- net/netfilter/nf_tables_api.c | 3 +-- net/netfilter/nft_compat.c | 6 ++---- net/netfilter/nft_fib.c | 3 +-- net/netfilter/nft_flow_offload.c | 3 +-- net/netfilter/nft_fwd_netdev.c | 3 +-- net/netfilter/nft_immediate.c | 3 +-- net/netfilter/nft_lookup.c | 3 +-- net/netfilter/nft_masq.c | 3 +-- net/netfilter/nft_meta.c | 6 ++---- net/netfilter/nft_nat.c | 3 +-- net/netfilter/nft_osf.c | 3 +-- net/netfilter/nft_queue.c | 3 +-- net/netfilter/nft_redir.c | 3 +-- net/netfilter/nft_reject.c | 3 +-- net/netfilter/nft_reject_inet.c | 3 +-- net/netfilter/nft_reject_netdev.c | 3 +-- net/netfilter/nft_rt.c | 3 +-- net/netfilter/nft_socket.c | 3 +-- net/netfilter/nft_synproxy.c | 3 +-- net/netfilter/nft_tproxy.c | 3 +-- net/netfilter/nft_xfrm.c | 3 +-- 26 files changed, 28 insertions(+), 57 deletions(-)
include/net/netfilter/nf_tables.h +1 -2
@@ -932,8 +932,7 @@ struct nft_expr_ops {int (*dump)(struct sk_buff *skb,const struct nft_expr *expr);int (*validate)(const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data); +const struct nft_expr *expr);bool (*reduce)(struct nft_regs_track *track,const struct nft_expr *expr); bool (*gc)(struct net *net,
include/net/netfilter/nft_fib.h +1 -3
@@ -21,9 +21,7 @@ nft_fib_is_loopback(const struct sk_buff *skb, const struct net_device *in)int nft_fib_dump (struct sk_buff *skb,const struct nft_expr *expr);int nft_fib_init (const struct nft_ctx *ctx,const struct nft_expr *expr,const struct nlattr *const tb[]); -int nft_fib_validate (const struct nft_ctx *ctx,const struct nft_expr *expr, -const struct nft_data **data); - +int nft_fib_validate (const struct nft_ctx *ctx,const struct nft_expr *expr);void nft_fib4_eval_type (const struct nft_expr *expr,struct nft_regs *regs,const struct nft_pktinfo *pkt);
include/net/netfilter/nft_meta.h +1 -2
@@ -41,8 +41,7 @@ void nft_meta_set_destroy(const struct nft_ctx *ctx, const struct nft_expr *expr);int nft_meta_set_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data); +const struct nft_expr *expr);bool nft_meta_get_reduce (struct nft_regs_track *track,const struct nft_expr *expr);
include/net/netfilter/nft_reject.h +1 -2
@@ -15,8 +15,7 @@ struct nft_reject {extern const struct nla_policy nft_reject_policy[];int nft_reject_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data); +const struct nft_expr *expr); int nft_reject_init(const struct nft_ctx *ctx, const struct nft_expr *expr,
net/bridge/netfilter/nft_reject_bridge.c +1 -2
@@ -170,8 +170,7 @@ static void nft_reject_bridge_eval(const struct nft_expr *expr, }static int nft_reject_bridge_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {return nft_chain_validate_hooks (ctx->chain, (1 <<NF_BR_PRE_ROUTING ) | (1 <<NF_BR_LOCAL_IN ));
net/netfilter/nf_tables_api.c +1 -2
@@ -3538,7 +3538,6 @@ static void nf_tables_rule_release(const struct nft_ctx *ctx, struct nft_rule *rint nft_chain_validate (const struct nft_ctx *ctx,const struct nft_chain *chain) {struct nft_expr *expr, *last; -const struct nft_data *data;struct nft_rule *rule;int err;
@@ -3556,7 +3555,7 @@ int nft_chain_validate(const struct nft_ctx *ctx, const struct nft_chain *chain)/* This may call nft_chain_validate() recursively, * callers that do so must increment ctx->level. */ - err = expr->ops->validate (ctx, expr, &data); + err = expr->ops->validate (ctx, expr);if (err <0 )return err; }
net/netfilter/nft_compat.c +2 -4
@@ -350,8 +350,7 @@ static int nft_target_dump(struct sk_buff *skb, const struct nft_expr *expr) }static int nft_target_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {struct xt_target *target = expr->ops->data;unsigned int hook_mask =0 ;
@@ -610,8 +609,7 @@ static int nft_match_large_dump(struct sk_buff *skb, const struct nft_expr *e) }static int nft_match_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {struct xt_match *match = expr->ops->data;unsigned int hook_mask =0 ;
net/netfilter/nft_fib.c +1 -2
@@ -25,8 +25,7 @@ EXPORT_SYMBOL(nft_fib_policy); NFTA_FIB_F_MARK | NFTA_FIB_F_IIF | NFTA_FIB_F_OIF | \ NFTA_FIB_F_PRESENT) -int nft_fib_validate (const struct nft_ctx *ctx,const struct nft_expr *expr, -const struct nft_data **data) +int nft_fib_validate (const struct nft_ctx *ctx,const struct nft_expr *expr) {const struct nft_fib *priv =nft_expr_priv (expr);unsigned int hooks;
net/netfilter/nft_flow_offload.c +1 -2
@@ -392,8 +392,7 @@ static void nft_flow_offload_eval(const struct nft_expr *expr, }static int nft_flow_offload_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {unsigned int hook_mask = (1 <<NF_INET_FORWARD );
net/netfilter/nft_fwd_netdev.c +1 -2
@@ -212,8 +212,7 @@ static int nft_fwd_neigh_dump(struct sk_buff *skb, const struct nft_expr *expr) }static int nft_fwd_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {return nft_chain_validate_hooks (ctx->chain, (1 <<NF_NETDEV_INGRESS ) | (1 <<NF_NETDEV_EGRESS ));
net/netfilter/nft_immediate.c +1 -2
@@ -243,8 +243,7 @@ static int nft_immediate_dump(struct sk_buff *skb, const struct nft_expr *expr) }static int nft_immediate_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **d) +const struct nft_expr *expr) {const struct nft_immediate_expr *priv =nft_expr_priv (expr);struct nft_ctx *pctx = (struct nft_ctx *)ctx;
net/netfilter/nft_lookup.c +1 -2
@@ -200,8 +200,7 @@ static int nft_lookup_dump(struct sk_buff *skb, const struct nft_expr *expr) }static int nft_lookup_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **d) +const struct nft_expr *expr) {const struct nft_lookup *priv =nft_expr_priv (expr);struct nft_set_iter iter;
net/netfilter/nft_masq.c +1 -2
@@ -26,8 +26,7 @@ static const struct nla_policy nft_masq_policy[NFTA_MASQ_MAX + 1] = { };static int nft_masq_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {int err;
net/netfilter/nft_meta.c +2 -4
@@ -581,8 +581,7 @@ static int nft_meta_get_validate_xfrm(const struct nft_ctx *ctx) }static int nft_meta_get_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {const struct nft_meta *priv =nft_expr_priv (expr);
@@ -600,8 +599,7 @@ static int nft_meta_get_validate(const struct nft_ctx *ctx, }int nft_meta_set_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {struct nft_meta *priv =nft_expr_priv (expr);unsigned int hooks;
net/netfilter/nft_nat.c +1 -2
@@ -136,8 +136,7 @@ static const struct nla_policy nft_nat_policy[NFTA_NAT_MAX + 1] = { };static int nft_nat_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {struct nft_nat *priv =nft_expr_priv (expr);int err;
net/netfilter/nft_osf.c +1 -2
@@ -117,8 +117,7 @@ static int nft_osf_dump(struct sk_buff *skb, const struct nft_expr *expr) }static int nft_osf_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {unsigned int hooks;
net/netfilter/nft_queue.c +1 -2
@@ -69,8 +69,7 @@ static void nft_queue_sreg_eval(const struct nft_expr *expr, }static int nft_queue_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) { static const unsigned int supported_hooks = ((1 << NF_INET_PRE_ROUTING) | (1 << NF_INET_LOCAL_IN) |
net/netfilter/nft_redir.c +1 -2
@@ -26,8 +26,7 @@ static const struct nla_policy nft_redir_policy[NFTA_REDIR_MAX + 1] = { };static int nft_redir_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {int err;
net/netfilter/nft_reject.c +1 -2
@@ -24,8 +24,7 @@ const struct nla_policy nft_reject_policy[NFTA_REJECT_MAX + 1] = {EXPORT_SYMBOL_GPL (nft_reject_policy);int nft_reject_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) { return nft_chain_validate_hooks(ctx->chain, (1 << NF_INET_LOCAL_IN) |
net/netfilter/nft_reject_inet.c +1 -2
@@ -61,8 +61,7 @@ static void nft_reject_inet_eval(const struct nft_expr *expr, }static int nft_reject_inet_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) { return nft_chain_validate_hooks(ctx->chain, (1 << NF_INET_LOCAL_IN) |
net/netfilter/nft_reject_netdev.c +1 -2
@@ -145,8 +145,7 @@ static void nft_reject_netdev_eval(const struct nft_expr *expr, }static int nft_reject_netdev_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) {return nft_chain_validate_hooks (ctx->chain, (1 <<NF_NETDEV_INGRESS )); }
net/netfilter/nft_rt.c +1 -2
@@ -160,8 +160,7 @@ static int nft_rt_get_dump(struct sk_buff *skb,return -1 ; } -static int nft_rt_validate (const struct nft_ctx *ctx,const struct nft_expr *expr, -const struct nft_data **data) +static int nft_rt_validate (const struct nft_ctx *ctx,const struct nft_expr *expr) {const struct nft_rt *priv =nft_expr_priv (expr);unsigned int hooks;
net/netfilter/nft_socket.c +1 -2
@@ -275,8 +275,7 @@ static bool nft_socket_reduce(struct nft_regs_track *track, }static int nft_socket_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) { if (ctx->family != NFPROTO_IPV4 && ctx->family != NFPROTO_IPV6 &&
net/netfilter/nft_synproxy.c +1 -2
@@ -248,8 +248,7 @@ static void nft_synproxy_eval(const struct nft_expr *expr, }static int nft_synproxy_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) { if (ctx->family != NFPROTO_IPV4 && ctx->family != NFPROTO_IPV6 &&
net/netfilter/nft_tproxy.c +1 -2
@@ -313,8 +313,7 @@ static int nft_tproxy_dump(struct sk_buff *skb, }static int nft_tproxy_validate (const struct nft_ctx *ctx, -const struct nft_expr *expr, -const struct nft_data **data) +const struct nft_expr *expr) { if (ctx->family != NFPROTO_IPV4 && ctx->family != NFPROTO_IPV6 &&
net/netfilter/nft_xfrm.c +1 -2
@@ -229,8 +229,7 @@ static int nft_xfrm_get_dump(struct sk_buff *skb,return 0 ; } -static int nft_xfrm_validate (const struct nft_ctx *ctx,const struct nft_expr *expr, -const struct nft_data **data) +static int nft_xfrm_validate (const struct nft_ctx *ctx,const struct nft_expr *expr) {const struct nft_xfrm *priv =nft_expr_priv (expr);unsigned int hooks;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/7 netfilter: bitwise: rename some boolean operation functions
In reply to Sasha LevinFrom: Jeremy Sowden <[email protected]>
[ Upstream commit a12143e6084c502fc3cfaa8b717bffc8c14cf806 ]
In the next patch we add support for doing AND, OR and XOR operations directly in the kernel, so rename some functions and an enum constant related to mask-and-xor boolean operations.
Stable-dep-of: d07955dd34ec ("netfilter: nft_fib: reject fib expression on the netdev egress hook")
--- include/uapi/linux/netfilter/nf_tables.h | 10 ++++--- net/netfilter/nft_bitwise.c | 34 ++++++++++++------------ 2 files changed, 24 insertions(+), 20 deletions(-)
include/uapi/linux/netfilter/nf_tables.h +7 -3
@@ -541,16 +541,20 @@ enum nft_immediate_attributes {/** * enum nft_bitwise_ops - nf_tables bitwise operations * -* @NFT_BITWISE_BOOL: mask-and-xor operation used to implement NOT, AND, OR and -* XOR boolean operations +* @NFT_BITWISE_MASK_XOR: mask-and-xor operation used to implement NOT, AND, OR +* and XOR boolean operations * @NFT_BITWISE_LSHIFT: left-shift operation * @NFT_BITWISE_RSHIFT: right-shift operation */ enum nft_bitwise_ops { -NFT_BITWISE_BOOL , +NFT_BITWISE_MASK_XOR ,NFT_BITWISE_LSHIFT ,NFT_BITWISE_RSHIFT , }; +/* +* Old name for NFT_BITWISE_MASK_XOR. Retained for backwards-compatibility. +*/ +#define NFT_BITWISE_BOOL NFT_BITWISE_MASK_XOR/** * enum nft_bitwise_attributes - nf_tables bitwise expression netlink attributes
net/netfilter/nft_bitwise.c +17 -17
@@ -25,8 +25,8 @@ struct nft_bitwise {struct nft_data data; }; -static void nft_bitwise_eval_bool (u32 *dst,const u32 *src, -const struct nft_bitwise *priv) +static void nft_bitwise_eval_mask_xor (u32 *dst,const u32 *src, +const struct nft_bitwise *priv) {unsigned int i;
@@ -68,8 +68,8 @@ void nft_bitwise_eval(const struct nft_expr *expr,u32 *dst = ®s->data[priv->dreg];switch (priv->op) { -case NFT_BITWISE_BOOL : -nft_bitwise_eval_bool (dst, src, priv); +case NFT_BITWISE_MASK_XOR : +nft_bitwise_eval_mask_xor (dst, src, priv);break ;case NFT_BITWISE_LSHIFT :nft_bitwise_eval_lshift (dst, src, priv);
@@ -90,8 +90,8 @@ static const struct nla_policy nft_bitwise_policy[NFTA_BITWISE_MAX + 1] = { [NFTA_BITWISE_DATA] = { .type = NLA_NESTED }, }; -static int nft_bitwise_init_bool (struct nft_bitwise *priv, -const struct nlattr *const tb[]) +static int nft_bitwise_init_mask_xor (struct nft_bitwise *priv, +const struct nlattr *const tb[]) {struct nft_data_desc mask = { .type =NFT_DATA_VALUE ,
@@ -186,7 +186,7 @@ static int nft_bitwise_init(const struct nft_ctx *ctx,if (tb[NFTA_BITWISE_OP ]) { priv->op =ntohl (nla_get_be32 (tb[NFTA_BITWISE_OP ]));switch (priv->op) { -case NFT_BITWISE_BOOL : +case NFT_BITWISE_MASK_XOR :case NFT_BITWISE_LSHIFT :case NFT_BITWISE_RSHIFT :break ;
@@ -194,12 +194,12 @@ static int nft_bitwise_init(const struct nft_ctx *ctx,return -EOPNOTSUPP ; } }else { - priv->op =NFT_BITWISE_BOOL ; + priv->op =NFT_BITWISE_MASK_XOR ; }switch (priv->op) { -case NFT_BITWISE_BOOL : - err =nft_bitwise_init_bool (priv, tb); +case NFT_BITWISE_MASK_XOR : + err =nft_bitwise_init_mask_xor (priv, tb);break ;case NFT_BITWISE_LSHIFT :case NFT_BITWISE_RSHIFT :
@@ -210,8 +210,8 @@ static int nft_bitwise_init(const struct nft_ctx *ctx,return err; } -static int nft_bitwise_dump_bool (struct sk_buff *skb, -const struct nft_bitwise *priv) +static int nft_bitwise_dump_mask_xor (struct sk_buff *skb, +const struct nft_bitwise *priv) {if (nft_data_dump (skb,NFTA_BITWISE_MASK , &priv->mask,NFT_DATA_VALUE , priv->len) <0 )
@@ -248,8 +248,8 @@ static int nft_bitwise_dump(struct sk_buff *skb, const struct nft_expr *expr)return -1 ;switch (priv->op) { -case NFT_BITWISE_BOOL : - err =nft_bitwise_dump_bool (skb, priv); +case NFT_BITWISE_MASK_XOR : + err =nft_bitwise_dump_mask_xor (skb, priv);break ;case NFT_BITWISE_LSHIFT :case NFT_BITWISE_RSHIFT :
@@ -269,7 +269,7 @@ static int nft_bitwise_offload(struct nft_offload_ctx *ctx,const struct nft_bitwise *priv =nft_expr_priv (expr);struct nft_offload_reg *reg = &ctx->regs[priv->dreg]; -if (priv->op !=NFT_BITWISE_BOOL ) +if (priv->op !=NFT_BITWISE_MASK_XOR )return -EOPNOTSUPP ; if (memcmp(&priv->xor, &zero, sizeof(priv->xor)) ||
@@ -405,7 +405,7 @@ nft_bitwise_fast_dump(struct sk_buff *skb, const struct nft_expr *expr)return -1 ;if (nla_put_be32 (skb,NFTA_BITWISE_LEN ,htonl (sizeof (u32))))return -1 ; -if (nla_put_be32 (skb,NFTA_BITWISE_OP ,htonl (NFT_BITWISE_BOOL ))) +if (nla_put_be32 (skb,NFTA_BITWISE_OP ,htonl (NFT_BITWISE_MASK_XOR )))return -1 ; data.data[0 ] = priv->mask;
@@ -500,7 +500,7 @@ nft_bitwise_select_ops(const struct nft_ctx *ctx,return &nft_bitwise_ops;if (tb[NFTA_BITWISE_OP ] && -ntohl (nla_get_be32 (tb[NFTA_BITWISE_OP ])) !=NFT_BITWISE_BOOL ) +ntohl (nla_get_be32 (tb[NFTA_BITWISE_OP ])) !=NFT_BITWISE_MASK_XOR )return &nft_bitwise_ops;return &nft_bitwise_fast_ops;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 4/7 netfilter: nf_tables: Remove unused nft_reduce_is_readonly()
In reply to Sasha LevinFrom: Yue Haibing <[email protected]>
[ Upstream commit bf6788742b8d6c73de441e088a71de7154f0d4aa ]
Since commit 9e539c5b6d9c ("netfilter: nf_tables: disable expression reduction infra") this is unused.
Stable-dep-of: d07955dd34ec ("netfilter: nft_fib: reject fib expression on the netdev egress hook")
--- include/net/netfilter/nf_tables.h | 5 ----- 1 file changed, 5 deletions(-)
include/net/netfilter/nf_tables.h +0 -5
@@ -1773,11 +1773,6 @@ static inline u64 nft_net_tstamp(const struct net *net)#define __NFT_REDUCE_READONLY 1UL#define NFT_REDUCE_READONLY (void *)__NFT_REDUCE_READONLY -static inline bool nft_reduce_is_readonly (const struct nft_expr *expr) -{ -return expr->ops->reduce ==NFT_REDUCE_READONLY ; -} -void nft_reg_track_update (struct nft_regs_track *track,const struct nft_expr *expr,u8 dreg,u8 len);void nft_reg_track_cancel (struct nft_regs_track *track,u8 dreg,u8 len);
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 5/7 netfilter: nft_objref: validate objref and objrefmap expressions
In reply to Sasha LevinFrom: Fernando Fernandez Mancera <[email protected]>
[ Upstream commit f359b809d54c6e3dd1d039b97e0b68390b0e53e4 ]
Referencing a synproxy stateful object from OUTPUT hook causes kernel crash due to infinite recursive calls:
BUG: TASK stack guard page was hit at 000000008bda5b8c (stack is 000000003ab1c4a5..00000000494d8b12) [...] Call Trace: __find_rr_leaf+0x99/0x230 fib6_table_lookup+0x13b/0x2d0 ip6_pol_route+0xa4/0x400 fib6_rule_lookup+0x156/0x240 ip6_route_output_flags+0xc6/0x150 __nf_ip6_route+0x23/0x50 synproxy_send_tcp_ipv6+0x106/0x200 synproxy_send_client_synack_ipv6+0x1aa/0x1f0 nft_synproxy_do_eval+0x263/0x310 nft_do_chain+0x5a8/0x5f0 [nf_tables nft_do_chain_inet+0x98/0x110 nf_hook_slow+0x43/0xc0 __ip6_local_out+0xf0/0x170 ip6_local_out+0x17/0x70 synproxy_send_tcp_ipv6+0x1a2/0x200 synproxy_send_client_synack_ipv6+0x1aa/0x1f0
[...]
Implement objref and objrefmap expression validate functions.
Currently, only NFT_OBJECT_SYNPROXY object type requires validation. This will also handle a jump to a chain using a synproxy object from the OUTPUT hook.
Now when trying to reference a synproxy object in the OUTPUT hook, nft will produce the following error:
synproxy_crash.nft: Error: Could not process rule: Operation not supported
synproxy name mysynproxy
^^^^^^^^^^^^^^^^^^^^^^^^
Stable-dep-of: d07955dd34ec ("netfilter: nft_fib: reject fib expression on the netdev egress hook")
--- net/netfilter/nft_objref.c | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+)
net/netfilter/nft_objref.c +39 -0
@@ -22,6 +22,35 @@ static void nft_objref_eval(const struct nft_expr *expr, obj->ops->eval (obj, regs, pkt); } +static int nft_objref_validate_obj_type (const struct nft_ctx *ctx,u32 type) +{ +unsigned int hooks; + +switch (type) { +case NFT_OBJECT_SYNPROXY : +if (ctx->family !=NFPROTO_IPV4 && + ctx->family !=NFPROTO_IPV6 && + ctx->family !=NFPROTO_INET ) +return -EOPNOTSUPP ; + + hooks = (1 <<NF_INET_LOCAL_IN ) | (1 <<NF_INET_FORWARD ); + +return nft_chain_validate_hooks (ctx->chain, hooks); +default : +break ; + } + +return 0 ; +} + +static int nft_objref_validate (const struct nft_ctx *ctx, +const struct nft_expr *expr) +{ +struct nft_object *obj =nft_objref_priv (expr); + +return nft_objref_validate_obj_type (ctx, obj->ops->type->type); +} +static int nft_objref_init (const struct nft_ctx *ctx,const struct nft_expr *expr,const struct nlattr *const tb[])
@@ -93,6 +122,7 @@ static const struct nft_expr_ops nft_objref_ops = { .activate = nft_objref_activate, .deactivate = nft_objref_deactivate, .dump = nft_objref_dump, + .validate = nft_objref_validate, .reduce = NFT_REDUCE_READONLY, };
@@ -197,6 +227,14 @@ static void nft_objref_map_destroy(const struct nft_ctx *ctx,nf_tables_destroy_set (ctx, priv->set); } +static int nft_objref_map_validate (const struct nft_ctx *ctx, +const struct nft_expr *expr) +{ +const struct nft_objref_map *priv =nft_expr_priv (expr); + +return nft_objref_validate_obj_type (ctx, priv->set->objtype); +} +static struct nft_expr_type nft_objref_type;static const struct nft_expr_ops nft_objref_map_ops = { .type = &nft_objref_type,
@@ -207,6 +245,7 @@ static const struct nft_expr_ops nft_objref_map_ops = { .deactivate = nft_objref_map_deactivate, .destroy = nft_objref_map_destroy, .dump = nft_objref_map_dump, + .validate = nft_objref_map_validate, .reduce = NFT_REDUCE_READONLY, };
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 6/7 netfilter: nf_tables: remove register tracking infrastructure
In reply to Sasha LevinFrom: Florian Westphal <[email protected]>
[ Upstream commit 6b94d081f81dd524626f7aab2b98a9de335edb72 ]
This facility was disabled in commit9e539c5b6d9c ("netfilter: nf_tables: disable expression reduction infra"), because not all nft_exprs guarantee they will update the destination
register: some may set NFT_BREAK instead to cancel evaluation of the rule.
This has been dead code ever since.
There are no plans to salvage this at this time, so remove this.
Stable-dep-of: d07955dd34ec ("netfilter: nft_fib: reject fib expression on the netdev egress hook")
--- include/net/netfilter/nf_tables.h | 31 ------- include/net/netfilter/nft_fib.h | 2 - include/net/netfilter/nft_meta.h | 2 - net/bridge/netfilter/nft_meta_bridge.c | 20 ----- net/bridge/netfilter/nft_reject_bridge.c | 1 - net/ipv4/netfilter/nft_dup_ipv4.c | 1 - net/ipv4/netfilter/nft_fib_ipv4.c | 2 - net/ipv4/netfilter/nft_reject_ipv4.c | 1 - net/ipv6/netfilter/nft_dup_ipv6.c | 1 - net/ipv6/netfilter/nft_fib_ipv6.c | 2 - net/ipv6/netfilter/nft_reject_ipv6.c | 1 - net/netfilter/nf_tables_api.c | 67 --------------- net/netfilter/nft_bitwise.c | 103 ----------------------- net/netfilter/nft_byteorder.c | 11 --- net/netfilter/nft_cmp.c | 3 - net/netfilter/nft_compat.c | 10 --- net/netfilter/nft_connlimit.c | 1 - net/netfilter/nft_counter.c | 1 - net/netfilter/nft_ct.c | 45 ---------- net/netfilter/nft_dup_netdev.c | 1 - net/netfilter/nft_dynset.c | 1 - net/netfilter/nft_exthdr.c | 34 -------- net/netfilter/nft_fib.c | 42 --------- net/netfilter/nft_fib_inet.c | 1 - net/netfilter/nft_fib_netdev.c | 1 - net/netfilter/nft_flow_offload.c | 1 - net/netfilter/nft_fwd_netdev.c | 2 - net/netfilter/nft_hash.c | 36 -------- net/netfilter/nft_immediate.c | 12 --- net/netfilter/nft_last.c | 1 - net/netfilter/nft_limit.c | 2 - net/netfilter/nft_log.c | 1 - net/netfilter/nft_lookup.c | 12 --- net/netfilter/nft_masq.c | 3 - net/netfilter/nft_meta.c | 45 ---------- net/netfilter/nft_nat.c | 2 - net/netfilter/nft_numgen.c | 22 ----- net/netfilter/nft_objref.c | 2 - net/netfilter/nft_osf.c | 25 ------ net/netfilter/nft_payload.c | 47 ----------- net/netfilter/nft_queue.c | 2 - net/netfilter/nft_quota.c | 1 - net/netfilter/nft_range.c | 1 - net/netfilter/nft_redir.c | 3 - net/netfilter/nft_reject_inet.c | 1 - net/netfilter/nft_reject_netdev.c | 1 - net/netfilter/nft_rt.c | 1 - net/netfilter/nft_socket.c | 26 ------ net/netfilter/nft_synproxy.c | 1 - net/netfilter/nft_tproxy.c | 1 - net/netfilter/nft_tunnel.c | 26 ------ net/netfilter/nft_xfrm.c | 27 ------ 52 files changed, 689 deletions(-)
include/net/netfilter/nf_tables.h +0 -31
@@ -122,17 +122,6 @@ struct nft_regs { }; }; -struct nft_regs_track { -struct { -const struct nft_expr *selector; -const struct nft_expr *bitwise; -u8 num_reg; - } regs[NFT_REG32_NUM ]; - -const struct nft_expr *cur; -const struct nft_expr *last; -}; -/* Store/load an u8, u16 or u64 integer to/from the u32 data register. * * Note, when using concatenations, register allocation happens at 32-bit
@@ -405,8 +394,6 @@ int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src, gfp_t gfp);void nft_expr_destroy (const struct nft_ctx *ctx,struct nft_expr *expr);int nft_expr_dump (struct sk_buff *skb,unsigned int attr,const struct nft_expr *expr); -bool nft_expr_reduce_bitwise (struct nft_regs_track *track, -const struct nft_expr *expr);struct nft_set_ext ;
@@ -933,8 +920,6 @@ struct nft_expr_ops { const struct nft_expr *expr);int (*validate)(const struct nft_ctx *ctx,const struct nft_expr *expr); -bool (*reduce)(struct nft_regs_track *track, -const struct nft_expr *expr);bool (*gc)(struct net *net,const struct nft_expr *expr); int (*offload)(struct nft_offload_ctx *ctx,
@@ -1770,20 +1755,4 @@ static inline u64 nft_net_tstamp(const struct net *net) return nft_pernet(net)->tstamp; } -#define __NFT_REDUCE_READONLY 1UL -#define NFT_REDUCE_READONLY (void *)__NFT_REDUCE_READONLY - -void nft_reg_track_update (struct nft_regs_track *track, -const struct nft_expr *expr,u8 dreg,u8 len); -void nft_reg_track_cancel (struct nft_regs_track *track,u8 dreg,u8 len); -void __nft_reg_track_cancel (struct nft_regs_track *track,u8 dreg); - -static inline bool nft_reg_track_cmp (struct nft_regs_track *track, -const struct nft_expr *expr,u8 dreg) -{ -return track->regs[dreg].selector && - track->regs[dreg].selector->ops == expr->ops && - track->regs[dreg].num_reg ==0 ; -} -#endif /* _NET_NF_TABLES_H */
include/net/netfilter/nft_fib.h +0 -2
@@ -36,6 +36,4 @@ void nft_fib6_eval(const struct nft_expr *expr, struct nft_regs *regs,void nft_fib_store_result (void *reg,const struct nft_fib *priv,const struct net_device *dev); -bool nft_fib_reduce (struct nft_regs_track *track, -const struct nft_expr *expr);#endif
include/net/netfilter/nft_meta.h +0 -2
@@ -43,6 +43,4 @@ void nft_meta_set_destroy(const struct nft_ctx *ctx,int nft_meta_set_validate (const struct nft_ctx *ctx,const struct nft_expr *expr); -bool nft_meta_get_reduce (struct nft_regs_track *track, -const struct nft_expr *expr);#endif
net/bridge/netfilter/nft_meta_bridge.c +0 -20
@@ -99,27 +99,8 @@ static const struct nft_expr_ops nft_meta_bridge_get_ops = { .eval = nft_meta_bridge_get_eval, .init = nft_meta_bridge_get_init, .dump = nft_meta_get_dump, - .reduce = nft_meta_get_reduce, }; -static bool nft_meta_bridge_set_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -int i; - -for (i =0 ; i <NFT_REG32_NUM ; i++) { -if (!track->regs[i].selector) -continue ; - -if (track->regs[i].selector->ops != &nft_meta_bridge_get_ops) -continue ; - -__nft_reg_track_cancel (track, i); - } - -return false; -} -static const struct nft_expr_ops nft_meta_bridge_set_ops = { .type = &nft_meta_bridge_type, .size =NFT_EXPR_SIZE (sizeof (struct nft_meta )),
@@ -127,7 +108,6 @@ static const struct nft_expr_ops nft_meta_bridge_set_ops = { .init = nft_meta_set_init, .destroy = nft_meta_set_destroy, .dump = nft_meta_set_dump, - .reduce = nft_meta_bridge_set_reduce, .validate = nft_meta_set_validate, };
net/bridge/netfilter/nft_reject_bridge.c +0 -1
@@ -184,7 +184,6 @@ static const struct nft_expr_ops nft_reject_bridge_ops = { .init = nft_reject_init, .dump = nft_reject_dump, .validate = nft_reject_bridge_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_reject_bridge_type__read_mostly = {
net/ipv4/netfilter/nft_dup_ipv4.c +0 -1
@@ -75,7 +75,6 @@ static const struct nft_expr_ops nft_dup_ipv4_ops = { .eval = nft_dup_ipv4_eval, .init = nft_dup_ipv4_init, .dump = nft_dup_ipv4_dump, - .reduce = NFT_REDUCE_READONLY, };static const struct nla_policy nft_dup_ipv4_policy[NFTA_DUP_MAX +1 ] = {
net/ipv4/netfilter/nft_fib_ipv4.c +0 -2
@@ -158,7 +158,6 @@ static const struct nft_expr_ops nft_fib4_type_ops = { .init = nft_fib_init, .dump = nft_fib_dump, .validate = nft_fib_validate, - .reduce = nft_fib_reduce, };static const struct nft_expr_ops nft_fib4_ops = {
@@ -168,7 +167,6 @@ static const struct nft_expr_ops nft_fib4_ops = { .init = nft_fib_init, .dump = nft_fib_dump, .validate = nft_fib_validate, - .reduce = nft_fib_reduce, }; static const struct nft_expr_ops *
net/ipv4/netfilter/nft_reject_ipv4.c +0 -1
@@ -45,7 +45,6 @@ static const struct nft_expr_ops nft_reject_ipv4_ops = { .init = nft_reject_init, .dump = nft_reject_dump, .validate = nft_reject_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_reject_ipv4_type__read_mostly = {
net/ipv6/netfilter/nft_dup_ipv6.c +0 -1
@@ -73,7 +73,6 @@ static const struct nft_expr_ops nft_dup_ipv6_ops = { .eval = nft_dup_ipv6_eval, .init = nft_dup_ipv6_init, .dump = nft_dup_ipv6_dump, - .reduce = NFT_REDUCE_READONLY, };static const struct nla_policy nft_dup_ipv6_policy[NFTA_DUP_MAX +1 ] = {
net/ipv6/netfilter/nft_fib_ipv6.c +0 -2
@@ -226,7 +226,6 @@ static const struct nft_expr_ops nft_fib6_type_ops = { .init = nft_fib_init, .dump = nft_fib_dump, .validate = nft_fib_validate, - .reduce = nft_fib_reduce, };static const struct nft_expr_ops nft_fib6_ops = {
@@ -236,7 +235,6 @@ static const struct nft_expr_ops nft_fib6_ops = { .init = nft_fib_init, .dump = nft_fib_dump, .validate = nft_fib_validate, - .reduce = nft_fib_reduce, }; static const struct nft_expr_ops *
net/ipv6/netfilter/nft_reject_ipv6.c +0 -1
@@ -46,7 +46,6 @@ static const struct nft_expr_ops nft_reject_ipv6_ops = { .init = nft_reject_init, .dump = nft_reject_dump, .validate = nft_reject_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_reject_ipv6_type__read_mostly = {
net/netfilter/nf_tables_api.c +0 -67
89 lines not on this page · raw message
net/netfilter/nft_bitwise.c +0 -103
130 lines not on this page · raw message
net/netfilter/nft_byteorder.c +0 -11
@@ -169,23 +169,12 @@ static int nft_byteorder_dump(struct sk_buff *skb, const struct nft_expr *expr)return -1 ; } -static bool nft_byteorder_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -struct nft_byteorder *priv =nft_expr_priv (expr); - -nft_reg_track_cancel (track, priv->dreg, priv->len); - -return false; -} -static const struct nft_expr_ops nft_byteorder_ops = { .type = &nft_byteorder_type, .size =NFT_EXPR_SIZE (sizeof (struct nft_byteorder )), .eval = nft_byteorder_eval, .init = nft_byteorder_init, .dump = nft_byteorder_dump, - .reduce = nft_byteorder_reduce, };struct nft_expr_type nft_byteorder_type__read_mostly = {
net/netfilter/nft_cmp.c +0 -3
@@ -189,7 +189,6 @@ static const struct nft_expr_ops nft_cmp_ops = { .eval = nft_cmp_eval, .init = nft_cmp_init, .dump = nft_cmp_dump, - .reduce = NFT_REDUCE_READONLY, .offload = nft_cmp_offload, };
@@ -280,7 +279,6 @@ const struct nft_expr_ops nft_cmp_fast_ops = { .eval = NULL, /* inlined */ .init = nft_cmp_fast_init, .dump = nft_cmp_fast_dump, - .reduce = NFT_REDUCE_READONLY, .offload = nft_cmp_fast_offload, };
@@ -373,7 +371,6 @@ const struct nft_expr_ops nft_cmp16_fast_ops = { .eval = NULL, /* inlined */ .init = nft_cmp16_fast_init, .dump = nft_cmp16_fast_dump, - .reduce = NFT_REDUCE_READONLY, .offload = nft_cmp16_fast_offload, };
net/netfilter/nft_compat.c +0 -10
@@ -775,14 +775,6 @@ static const struct nfnetlink_subsystem nfnl_compat_subsys = {static struct nft_expr_type nft_match_type; -static bool nft_match_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct xt_match *match = expr->ops->data; - -return strcmp (match->name,"comment" ) ==0 ; -} -static const struct nft_expr_ops *nft_match_select_ops (const struct nft_ctx *ctx,const struct nlattr *const tb[])
@@ -825,7 +817,6 @@ nft_match_select_ops(const struct nft_ctx *ctx, ops->dump = nft_match_dump; ops->validate = nft_match_validate; ops->data = match; - ops->reduce = nft_match_reduce; matchsize =NFT_EXPR_SIZE (XT_ALIGN (match->matchsize));if (matchsize >NFT_MATCH_LARGE_THRESH ) {
@@ -915,7 +906,6 @@ nft_target_select_ops(const struct nft_ctx *ctx, ops->dump = nft_target_dump; ops->validate = nft_target_validate; ops->data = target; - ops->reduce =NFT_REDUCE_READONLY ;if (family ==NFPROTO_BRIDGE ) ops->eval = nft_target_eval_bridge;
net/netfilter/nft_connlimit.c +0 -1
@@ -246,7 +246,6 @@ static const struct nft_expr_ops nft_connlimit_ops = { .destroy_clone = nft_connlimit_destroy_clone, .dump = nft_connlimit_dump, .gc = nft_connlimit_gc, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_connlimit_type__read_mostly = {
net/netfilter/nft_counter.c +0 -1
@@ -300,7 +300,6 @@ static const struct nft_expr_ops nft_counter_ops = { .destroy_clone = nft_counter_destroy, .dump = nft_counter_dump, .clone = nft_counter_clone, - .reduce = NFT_REDUCE_READONLY, .offload = nft_counter_offload, .offload_stats = nft_counter_offload_stats, };
net/netfilter/nft_ct.c +0 -45
77 lines not on this page · raw message
net/netfilter/nft_dup_netdev.c +0 -1
@@ -79,7 +79,6 @@ static const struct nft_expr_ops nft_dup_netdev_ops = { .eval = nft_dup_netdev_eval, .init = nft_dup_netdev_init, .dump = nft_dup_netdev_dump, - .reduce = NFT_REDUCE_READONLY, .offload = nft_dup_netdev_offload, .offload_action = nft_dup_netdev_offload_action, };
net/netfilter/nft_dynset.c +0 -1
@@ -429,7 +429,6 @@ static const struct nft_expr_ops nft_dynset_ops = { .activate = nft_dynset_activate, .deactivate = nft_dynset_deactivate, .dump = nft_dynset_dump, - .reduce = NFT_REDUCE_READONLY, };struct nft_expr_type nft_dynset_type__read_mostly = {
net/netfilter/nft_exthdr.c +0 -34
@@ -699,40 +699,12 @@ static int nft_exthdr_dump_strip(struct sk_buff *skb, const struct nft_expr *expreturn nft_exthdr_dump_common (skb, priv); } -static bool nft_exthdr_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_exthdr *priv =nft_expr_priv (expr); -const struct nft_exthdr *exthdr; - -if (!nft_reg_track_cmp (track, expr, priv->dreg)) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - - exthdr =nft_expr_priv (track->regs[priv->dreg].selector); -if (priv->type != exthdr->type || - priv->op != exthdr->op || - priv->flags != exthdr->flags || - priv->offset != exthdr->offset || - priv->len != exthdr->len) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - -if (!track->regs[priv->dreg].bitwise) -return true; - -return nft_expr_reduce_bitwise (track, expr); -} -static const struct nft_expr_ops nft_exthdr_ipv6_ops = { .type = &nft_exthdr_type, .size =NFT_EXPR_SIZE (sizeof (struct nft_exthdr )), .eval = nft_exthdr_ipv6_eval, .init = nft_exthdr_init, .dump = nft_exthdr_dump, - .reduce = nft_exthdr_reduce, };static const struct nft_expr_ops nft_exthdr_ipv4_ops = {
@@ -741,7 +713,6 @@ static const struct nft_expr_ops nft_exthdr_ipv4_ops = { .eval = nft_exthdr_ipv4_eval, .init = nft_exthdr_ipv4_init, .dump = nft_exthdr_dump, - .reduce = nft_exthdr_reduce, };static const struct nft_expr_ops nft_exthdr_tcp_ops = {
@@ -750,7 +721,6 @@ static const struct nft_expr_ops nft_exthdr_tcp_ops = { .eval = nft_exthdr_tcp_eval, .init = nft_exthdr_init, .dump = nft_exthdr_dump, - .reduce = nft_exthdr_reduce, };static const struct nft_expr_ops nft_exthdr_tcp_set_ops = {
@@ -759,7 +729,6 @@ static const struct nft_expr_ops nft_exthdr_tcp_set_ops = { .eval = nft_exthdr_tcp_set_eval, .init = nft_exthdr_tcp_set_init, .dump = nft_exthdr_dump_set, - .reduce = NFT_REDUCE_READONLY, };static const struct nft_expr_ops nft_exthdr_tcp_strip_ops = {
@@ -768,7 +737,6 @@ static const struct nft_expr_ops nft_exthdr_tcp_strip_ops = { .eval = nft_exthdr_tcp_strip_eval, .init = nft_exthdr_tcp_strip_init, .dump = nft_exthdr_dump_strip, - .reduce = NFT_REDUCE_READONLY, };static const struct nft_expr_ops nft_exthdr_sctp_ops = {
@@ -777,7 +745,6 @@ static const struct nft_expr_ops nft_exthdr_sctp_ops = { .eval = nft_exthdr_sctp_eval, .init = nft_exthdr_init, .dump = nft_exthdr_dump, - .reduce = nft_exthdr_reduce, };static const struct nft_expr_ops nft_exthdr_dccp_ops = {
@@ -786,7 +753,6 @@ static const struct nft_expr_ops nft_exthdr_dccp_ops = { .eval = nft_exthdr_dccp_eval, .init = nft_exthdr_dccp_init, .dump = nft_exthdr_dump, - .reduce = nft_exthdr_reduce, }; static const struct nft_expr_ops *
net/netfilter/nft_fib.c +0 -42
47 lines not on this page · raw message
net/netfilter/nft_fib_inet.c +0 -1
@@ -49,7 +49,6 @@ static const struct nft_expr_ops nft_fib_inet_ops = { .init = nft_fib_init, .dump = nft_fib_dump, .validate = nft_fib_validate, - .reduce = nft_fib_reduce, };static struct nft_expr_type nft_fib_inet_type__read_mostly = {
net/netfilter/nft_fib_netdev.c +0 -1
@@ -58,7 +58,6 @@ static const struct nft_expr_ops nft_fib_netdev_ops = { .init = nft_fib_init, .dump = nft_fib_dump, .validate = nft_fib_validate, - .reduce = nft_fib_reduce, };static struct nft_expr_type nft_fib_netdev_type__read_mostly = {
net/netfilter/nft_flow_offload.c +0 -1
@@ -480,7 +480,6 @@ static const struct nft_expr_ops nft_flow_offload_ops = { .destroy = nft_flow_offload_destroy, .validate = nft_flow_offload_validate, .dump = nft_flow_offload_dump, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_flow_offload_type__read_mostly = {
net/netfilter/nft_fwd_netdev.c +0 -2
@@ -226,7 +226,6 @@ static const struct nft_expr_ops nft_fwd_neigh_netdev_ops = { .init = nft_fwd_neigh_init, .dump = nft_fwd_neigh_dump, .validate = nft_fwd_validate, - .reduce = NFT_REDUCE_READONLY, };static const struct nft_expr_ops nft_fwd_netdev_ops = {
@@ -236,7 +235,6 @@ static const struct nft_expr_ops nft_fwd_netdev_ops = { .init = nft_fwd_netdev_init, .dump = nft_fwd_netdev_dump, .validate = nft_fwd_validate, - .reduce = NFT_REDUCE_READONLY, .offload = nft_fwd_netdev_offload, .offload_action = nft_fwd_netdev_offload_action, };
net/netfilter/nft_hash.c +0 -36
@@ -165,16 +165,6 @@ static int nft_jhash_dump(struct sk_buff *skb,return -1 ; } -static bool nft_jhash_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_jhash *priv =nft_expr_priv (expr); - -nft_reg_track_cancel (track, priv->dreg,sizeof (u32)); - -return false; -} -static int nft_symhash_dump (struct sk_buff *skb,const struct nft_expr *expr) {
@@ -195,30 +185,6 @@ static int nft_symhash_dump(struct sk_buff *skb,return -1 ; } -static bool nft_symhash_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -struct nft_symhash *priv =nft_expr_priv (expr); -struct nft_symhash *symhash; - -if (!nft_reg_track_cmp (track, expr, priv->dreg)) { -nft_reg_track_update (track, expr, priv->dreg,sizeof (u32)); -return false; - } - - symhash =nft_expr_priv (track->regs[priv->dreg].selector); -if (priv->offset != symhash->offset || - priv->modulus != symhash->modulus) { -nft_reg_track_update (track, expr, priv->dreg,sizeof (u32)); -return false; - } - -if (!track->regs[priv->dreg].bitwise) -return true; - -return false; -} -static struct nft_expr_type nft_hash_type;static const struct nft_expr_ops nft_jhash_ops = { .type = &nft_hash_type,
@@ -226,7 +192,6 @@ static const struct nft_expr_ops nft_jhash_ops = { .eval = nft_jhash_eval, .init = nft_jhash_init, .dump = nft_jhash_dump, - .reduce = nft_jhash_reduce, };static const struct nft_expr_ops nft_symhash_ops = {
@@ -235,7 +200,6 @@ static const struct nft_expr_ops nft_symhash_ops = { .eval = nft_symhash_eval, .init = nft_symhash_init, .dump = nft_symhash_dump, - .reduce = nft_symhash_reduce, }; static const struct nft_expr_ops *
net/netfilter/nft_immediate.c +0 -12
@@ -319,17 +319,6 @@ static bool nft_immediate_offload_action(const struct nft_expr *expr)return false; } -static bool nft_immediate_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_immediate_expr *priv =nft_expr_priv (expr); - -if (priv->dreg !=NFT_REG_VERDICT ) -nft_reg_track_cancel (track, priv->dreg, priv->dlen); - -return false; -} -static const struct nft_expr_ops nft_imm_ops = { .type = &nft_imm_type, .size =NFT_EXPR_SIZE (sizeof (struct nft_immediate_expr )),
@@ -340,7 +329,6 @@ static const struct nft_expr_ops nft_imm_ops = { .destroy = nft_immediate_destroy, .dump = nft_immediate_dump, .validate = nft_immediate_validate, - .reduce = nft_immediate_reduce, .offload = nft_immediate_offload, .offload_action = nft_immediate_offload_action, };
net/netfilter/nft_last.c +0 -1
@@ -124,7 +124,6 @@ static const struct nft_expr_ops nft_last_ops = { .destroy = nft_last_destroy, .clone = nft_last_clone, .dump = nft_last_dump, - .reduce = NFT_REDUCE_READONLY, };struct nft_expr_type nft_last_type__read_mostly = {
net/netfilter/nft_limit.c +0 -2
@@ -242,7 +242,6 @@ static const struct nft_expr_ops nft_limit_pkts_ops = { .destroy = nft_limit_pkts_destroy, .clone = nft_limit_pkts_clone, .dump = nft_limit_pkts_dump, - .reduce = NFT_REDUCE_READONLY, }; static void nft_limit_bytes_eval(const struct nft_expr *expr,
@@ -298,7 +297,6 @@ static const struct nft_expr_ops nft_limit_bytes_ops = { .dump = nft_limit_bytes_dump, .clone = nft_limit_bytes_clone, .destroy = nft_limit_bytes_destroy, - .reduce = NFT_REDUCE_READONLY, }; static const struct nft_expr_ops *
net/netfilter/nft_log.c +0 -1
@@ -290,7 +290,6 @@ static const struct nft_expr_ops nft_log_ops = { .init = nft_log_init, .destroy = nft_log_destroy, .dump = nft_log_dump, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_log_type__read_mostly = {
net/netfilter/nft_lookup.c +0 -12
@@ -226,17 +226,6 @@ static int nft_lookup_validate(const struct nft_ctx *ctx,return 0 ; } -static bool nft_lookup_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_lookup *priv =nft_expr_priv (expr); - -if (priv->set->flags &NFT_SET_MAP ) -nft_reg_track_cancel (track, priv->dreg, priv->set->dlen); - -return false; -} -static const struct nft_expr_ops nft_lookup_ops = { .type = &nft_lookup_type, .size =NFT_EXPR_SIZE (sizeof (struct nft_lookup )),
@@ -247,7 +236,6 @@ static const struct nft_expr_ops nft_lookup_ops = { .destroy = nft_lookup_destroy, .dump = nft_lookup_dump, .validate = nft_lookup_validate, - .reduce = nft_lookup_reduce, };struct nft_expr_type nft_lookup_type__read_mostly = {
net/netfilter/nft_masq.c +0 -3
@@ -128,7 +128,6 @@ static const struct nft_expr_ops nft_masq_ipv4_ops = { .destroy = nft_masq_ipv4_destroy, .dump = nft_masq_dump, .validate = nft_masq_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_masq_ipv4_type__read_mostly = {
@@ -175,7 +174,6 @@ static const struct nft_expr_ops nft_masq_ipv6_ops = { .destroy = nft_masq_ipv6_destroy, .dump = nft_masq_dump, .validate = nft_masq_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_masq_ipv6_type__read_mostly = {
@@ -231,7 +229,6 @@ static const struct nft_expr_ops nft_masq_inet_ops = { .destroy = nft_masq_inet_destroy, .dump = nft_masq_dump, .validate = nft_masq_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_masq_inet_type__read_mostly = {
net/netfilter/nft_meta.c +0 -45
67 lines not on this page · raw message
net/netfilter/nft_nat.c +0 -2
@@ -321,7 +321,6 @@ static const struct nft_expr_ops nft_nat_ops = { .destroy = nft_nat_destroy, .dump = nft_nat_dump, .validate = nft_nat_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_nat_type__read_mostly = {
@@ -352,7 +351,6 @@ static const struct nft_expr_ops nft_nat_inet_ops = { .destroy = nft_nat_destroy, .dump = nft_nat_dump, .validate = nft_nat_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_inet_nat_type__read_mostly = {
net/netfilter/nft_numgen.c +0 -22
@@ -84,16 +84,6 @@ static int nft_ng_inc_init(const struct nft_ctx *ctx,return err; } -static bool nft_ng_inc_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_ng_inc *priv =nft_expr_priv (expr); - -nft_reg_track_cancel (track, priv->dreg,NFT_REG32_SIZE ); - -return false; -} -static int nft_ng_dump (struct sk_buff *skb,enum nft_registers dreg,u32 modulus,enum nft_ng_types type,u32 offset) {
@@ -176,16 +166,6 @@ static int nft_ng_random_dump(struct sk_buff *skb, const struct nft_expr *expr) priv->offset); } -static bool nft_ng_random_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_ng_random *priv =nft_expr_priv (expr); - -nft_reg_track_cancel (track, priv->dreg,NFT_REG32_SIZE ); - -return false; -} -static struct nft_expr_type nft_ng_type;static const struct nft_expr_ops nft_ng_inc_ops = { .type = &nft_ng_type,
@@ -194,7 +174,6 @@ static const struct nft_expr_ops nft_ng_inc_ops = { .init = nft_ng_inc_init, .destroy = nft_ng_inc_destroy, .dump = nft_ng_inc_dump, - .reduce = nft_ng_inc_reduce, };static const struct nft_expr_ops nft_ng_random_ops = {
@@ -203,7 +182,6 @@ static const struct nft_expr_ops nft_ng_random_ops = { .eval = nft_ng_random_eval, .init = nft_ng_random_init, .dump = nft_ng_random_dump, - .reduce = nft_ng_random_reduce, }; static const struct nft_expr_ops *
net/netfilter/nft_objref.c +0 -2
@@ -123,7 +123,6 @@ static const struct nft_expr_ops nft_objref_ops = { .deactivate = nft_objref_deactivate, .dump = nft_objref_dump, .validate = nft_objref_validate, - .reduce = NFT_REDUCE_READONLY, };struct nft_objref_map {
@@ -246,7 +245,6 @@ static const struct nft_expr_ops nft_objref_map_ops = { .destroy = nft_objref_map_destroy, .dump = nft_objref_map_dump, .validate = nft_objref_map_validate, - .reduce = NFT_REDUCE_READONLY, }; static const struct nft_expr_ops *
net/netfilter/nft_osf.c +0 -25
@@ -135,30 +135,6 @@ static int nft_osf_validate(const struct nft_ctx *ctx,return nft_chain_validate_hooks (ctx->chain, hooks); } -static bool nft_osf_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -struct nft_osf *priv =nft_expr_priv (expr); -struct nft_osf *osf; - -if (!nft_reg_track_cmp (track, expr, priv->dreg)) { -nft_reg_track_update (track, expr, priv->dreg,NFT_OSF_MAXGENRELEN ); -return false; - } - - osf =nft_expr_priv (track->regs[priv->dreg].selector); -if (priv->flags != osf->flags || - priv->ttl != osf->ttl) { -nft_reg_track_update (track, expr, priv->dreg,NFT_OSF_MAXGENRELEN ); -return false; - } - -if (!track->regs[priv->dreg].bitwise) -return true; - -return false; -} -static struct nft_expr_type nft_osf_type;static const struct nft_expr_ops nft_osf_op = { .eval = nft_osf_eval,
@@ -167,7 +143,6 @@ static const struct nft_expr_ops nft_osf_op = { .dump = nft_osf_dump, .type = &nft_osf_type, .validate = nft_osf_validate, - .reduce = nft_osf_reduce, };static struct nft_expr_type nft_osf_type__read_mostly = {
net/netfilter/nft_payload.c +0 -47
77 lines not on this page · raw message
net/netfilter/nft_queue.c +0 -2
@@ -189,7 +189,6 @@ static const struct nft_expr_ops nft_queue_ops = { .init = nft_queue_init, .dump = nft_queue_dump, .validate = nft_queue_validate, - .reduce = NFT_REDUCE_READONLY, };static const struct nft_expr_ops nft_queue_sreg_ops = {
@@ -199,7 +198,6 @@ static const struct nft_expr_ops nft_queue_sreg_ops = { .init = nft_queue_sreg_init, .dump = nft_queue_sreg_dump, .validate = nft_queue_validate, - .reduce = NFT_REDUCE_READONLY, }; static const struct nft_expr_ops *
net/netfilter/nft_quota.c +0 -1
@@ -264,7 +264,6 @@ static const struct nft_expr_ops nft_quota_ops = { .destroy = nft_quota_destroy, .clone = nft_quota_clone, .dump = nft_quota_dump, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_quota_type__read_mostly = {
net/netfilter/nft_range.c +0 -1
@@ -137,7 +137,6 @@ static const struct nft_expr_ops nft_range_ops = { .eval = nft_range_eval, .init = nft_range_init, .dump = nft_range_dump, - .reduce = NFT_REDUCE_READONLY, };struct nft_expr_type nft_range_type__read_mostly = {
net/netfilter/nft_redir.c +0 -3
@@ -147,7 +147,6 @@ static const struct nft_expr_ops nft_redir_ipv4_ops = { .destroy = nft_redir_ipv4_destroy, .dump = nft_redir_dump, .validate = nft_redir_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_redir_ipv4_type__read_mostly = {
@@ -175,7 +174,6 @@ static const struct nft_expr_ops nft_redir_ipv6_ops = { .destroy = nft_redir_ipv6_destroy, .dump = nft_redir_dump, .validate = nft_redir_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_redir_ipv6_type__read_mostly = {
@@ -204,7 +202,6 @@ static const struct nft_expr_ops nft_redir_inet_ops = { .destroy = nft_redir_inet_destroy, .dump = nft_redir_dump, .validate = nft_redir_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_redir_inet_type__read_mostly = {
net/netfilter/nft_reject_inet.c +0 -1
@@ -79,7 +79,6 @@ static const struct nft_expr_ops nft_reject_inet_ops = { .init = nft_reject_init, .dump = nft_reject_dump, .validate = nft_reject_inet_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_reject_inet_type__read_mostly = {
net/netfilter/nft_reject_netdev.c +0 -1
@@ -158,7 +158,6 @@ static const struct nft_expr_ops nft_reject_netdev_ops = { .init = nft_reject_init, .dump = nft_reject_dump, .validate = nft_reject_netdev_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_reject_netdev_type__read_mostly = {
net/netfilter/nft_rt.c +0 -1
@@ -195,7 +195,6 @@ static const struct nft_expr_ops nft_rt_get_ops = { .init = nft_rt_get_init, .dump = nft_rt_get_dump, .validate = nft_rt_validate, - .reduce = NFT_REDUCE_READONLY, };struct nft_expr_type nft_rt_type__read_mostly = {
net/netfilter/nft_socket.c +0 -26
@@ -249,31 +249,6 @@ static int nft_socket_dump(struct sk_buff *skb,return 0 ; } -static bool nft_socket_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_socket *priv =nft_expr_priv (expr); -const struct nft_socket *socket; - -if (!nft_reg_track_cmp (track, expr, priv->dreg)) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - - socket =nft_expr_priv (track->regs[priv->dreg].selector); -if (priv->key != socket->key || - priv->dreg != socket->dreg || - priv->level != socket->level) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - -if (!track->regs[priv->dreg].bitwise) -return true; - -return nft_expr_reduce_bitwise (track, expr); -} -static int nft_socket_validate (const struct nft_ctx *ctx,const struct nft_expr *expr) {
@@ -296,7 +271,6 @@ static const struct nft_expr_ops nft_socket_ops = { .init = nft_socket_init, .dump = nft_socket_dump, .validate = nft_socket_validate, - .reduce = nft_socket_reduce, };static struct nft_expr_type nft_socket_type__read_mostly = {
net/netfilter/nft_synproxy.c +0 -1
@@ -290,7 +290,6 @@ static const struct nft_expr_ops nft_synproxy_ops = { .dump = nft_synproxy_dump, .type = &nft_synproxy_type, .validate = nft_synproxy_validate, - .reduce = NFT_REDUCE_READONLY, };static struct nft_expr_type nft_synproxy_type__read_mostly = {
net/netfilter/nft_tproxy.c +0 -1
@@ -331,7 +331,6 @@ static const struct nft_expr_ops nft_tproxy_ops = { .init = nft_tproxy_init, .destroy = nft_tproxy_destroy, .dump = nft_tproxy_dump, - .reduce = NFT_REDUCE_READONLY, .validate = nft_tproxy_validate, };
net/netfilter/nft_tunnel.c +0 -26
@@ -124,31 +124,6 @@ static int nft_tunnel_get_dump(struct sk_buff *skb,return -1 ; } -static bool nft_tunnel_get_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_tunnel *priv =nft_expr_priv (expr); -const struct nft_tunnel *tunnel; - -if (!nft_reg_track_cmp (track, expr, priv->dreg)) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - - tunnel =nft_expr_priv (track->regs[priv->dreg].selector); -if (priv->key != tunnel->key || - priv->dreg != tunnel->dreg || - priv->mode != tunnel->mode) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - -if (!track->regs[priv->dreg].bitwise) -return true; - -return false; -} -static struct nft_expr_type nft_tunnel_type;static const struct nft_expr_ops nft_tunnel_get_ops = { .type = &nft_tunnel_type,
@@ -156,7 +131,6 @@ static const struct nft_expr_ops nft_tunnel_get_ops = { .eval = nft_tunnel_get_eval, .init = nft_tunnel_get_init, .dump = nft_tunnel_get_dump, - .reduce = nft_tunnel_get_reduce, };static struct nft_expr_type nft_tunnel_type__read_mostly = {
net/netfilter/nft_xfrm.c +0 -27
@@ -258,32 +258,6 @@ static int nft_xfrm_validate(const struct nft_ctx *ctx, const struct nft_expr *ereturn nft_chain_validate_hooks (ctx->chain, hooks); } -static bool nft_xfrm_reduce (struct nft_regs_track *track, -const struct nft_expr *expr) -{ -const struct nft_xfrm *priv =nft_expr_priv (expr); -const struct nft_xfrm *xfrm; - -if (!nft_reg_track_cmp (track, expr, priv->dreg)) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - - xfrm =nft_expr_priv (track->regs[priv->dreg].selector); -if (priv->key != xfrm->key || - priv->dreg != xfrm->dreg || - priv->dir != xfrm->dir || - priv->spnum != xfrm->spnum) { -nft_reg_track_update (track, expr, priv->dreg, priv->len); -return false; - } - -if (!track->regs[priv->dreg].bitwise) -return true; - -return nft_expr_reduce_bitwise (track, expr); -} -static struct nft_expr_type nft_xfrm_type;static const struct nft_expr_ops nft_xfrm_get_ops = { .type = &nft_xfrm_type,
@@ -292,7 +266,6 @@ static const struct nft_expr_ops nft_xfrm_get_ops = { .init = nft_xfrm_get_init, .dump = nft_xfrm_get_dump, .validate = nft_xfrm_validate, - .reduce = nft_xfrm_reduce, };static struct nft_expr_type nft_xfrm_type__read_mostly = {
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 7/7 netfilter: nft_fib: reject fib expression on the netdev egress hook
In reply to Sasha LevinFrom: Theodor Arsenij Larionov-Trichkine <[email protected]>
[ Upstream commit d07955dd34ecae17d35d8c7d0a273a3fba653a8c ]
A fib expression in a netdev egress base chain dereferences nft_in(pkt), NULL on the transmit path, causing a NULL pointer dereference at eval. nft_fib_validate() masks the hook with NF_INET_* values, but netdev hook numbers are a separate enum that aliases them (NF_NETDEV_EGRESS == NF_INET_LOCAL_IN), so an egress chain passes validation and then faults.
Add nft_fib_netdev_validate() that limits each result/flag to the netdev hook where the device it reads exists: the input-device cases (OIF, OIFNAME, ADDRTYPE with F_IIF) to ingress, the output-device case (ADDRTYPE with F_OIF) to egress, ADDRTYPE with no device flag to both. Also restrict nft_fib_validate() to NFPROTO_IPV4/IPV6/INET so its NF_INET_* masks are not applied to another family's hooks.
--- net/netfilter/nft_fib.c | 9 +++++++++ net/netfilter/nft_fib_netdev.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-)
net/netfilter/nft_fib.c +9 -0
@@ -30,6 +30,15 @@ int nft_fib_validate(const struct nft_ctx *ctx, const struct nft_expr *expr)const struct nft_fib *priv =nft_expr_priv (expr);unsigned int hooks; +switch (ctx->family) { +case NFPROTO_IPV4 : +case NFPROTO_IPV6 : +case NFPROTO_INET : +break ; +default : +return -EOPNOTSUPP ; + } +switch (priv->result) {case NFT_FIB_RESULT_OIF :case NFT_FIB_RESULT_OIFNAME :
net/netfilter/nft_fib_netdev.c +28 -1
@@ -50,6 +50,33 @@ static void nft_fib_netdev_eval(const struct nft_expr *expr, regs->verdict.code =NFT_BREAK ; } +static int nft_fib_netdev_validate (const struct nft_ctx *ctx, +const struct nft_expr *expr) +{ +const struct nft_fib *priv =nft_expr_priv (expr); +unsigned int hooks; + +switch (priv->result) { +case NFT_FIB_RESULT_OIF : +case NFT_FIB_RESULT_OIFNAME : + hooks = (1 <<NF_NETDEV_INGRESS ); +break ; +case NFT_FIB_RESULT_ADDRTYPE : +if (priv->flags &NFTA_FIB_F_IIF ) + hooks = (1 <<NF_NETDEV_INGRESS ); +else if (priv->flags &NFTA_FIB_F_OIF ) + hooks = (1 <<NF_NETDEV_EGRESS ); +else + hooks = (1 <<NF_NETDEV_INGRESS ) | + (1 <<NF_NETDEV_EGRESS ); +break ; +default : +return -EINVAL ; + } + +return nft_chain_validate_hooks (ctx->chain, hooks); +} +static struct nft_expr_type nft_fib_netdev_type;static const struct nft_expr_ops nft_fib_netdev_ops = { .type = &nft_fib_netdev_type,
@@ -57,7 +84,7 @@ static const struct nft_expr_ops nft_fib_netdev_ops = { .eval = nft_fib_netdev_eval, .init = nft_fib_init, .dump = nft_fib_dump, - .validate = nft_fib_validate, + .validate = nft_fib_netdev_validate, };static struct nft_expr_type nft_fib_netdev_type__read_mostly = {
Signature · 1 line
2.53.0