FAILED: patch "[PATCH] netfilter: nft_socket: only do sk lookups when indev is" failed to apply to 5.15-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.15-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]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 743b83f15d4069ea57c3e40996bf4a1077e0cdc1 Mon Sep 17 00:00:00 2001
From: Florian Westphal <[email protected]>
Date: Thu, 28 Apr 2022 09:39:21 +0200
Subject: [PATCH] netfilter: nft_socket: only do sk lookups when indev is
available
Check if the incoming interface is available and NFT_BREAK in case neither skb->sk nor input device are set.
Because nf_sk_lookup_slow*() assume packet headers are in the 'in' direction, use in postrouting is not going to yield a meaningful result. Same is true for the forward chain, so restrict the use to prerouting, input and output.
Use in output work if a socket is already attached to the skb.
net/netfilter/nft_socket.c +38 -14
@@ -54,6 +54,32 @@ nft_sock_get_eval_cgroupv2(u32 *dest, struct sock *sk, const struct nft_pktinfo }#endif +static struct sock *nft_socket_do_lookup (const struct nft_pktinfo *pkt) +{ +const struct net_device *indev =nft_in (pkt); +const struct sk_buff *skb = pkt->skb; +struct sock *sk =NULL ; + +if (!indev) +return NULL ; + +switch (nft_pf (pkt)) { +case NFPROTO_IPV4 : + sk =nf_sk_lookup_slow_v4 (nft_net (pkt), skb, indev); +break ; +#if IS_ENABLED (CONFIG_NF_TABLES_IPV6 ) +case NFPROTO_IPV6 : + sk =nf_sk_lookup_slow_v6 (nft_net (pkt), skb, indev); +break ; +#endif +default : +WARN_ON_ONCE (1 ); +break ; + } + +return sk; +} +static void nft_socket_eval (const struct nft_expr *expr,struct nft_regs *regs,const struct nft_pktinfo *pkt)
@@ -67,20 +93,7 @@ static void nft_socket_eval(const struct nft_expr *expr, sk =NULL ;if (!sk) -switch (nft_pf (pkt)) { -case NFPROTO_IPV4 : - sk =nf_sk_lookup_slow_v4 (nft_net (pkt), skb,nft_in (pkt)); -break ; -#if IS_ENABLED (CONFIG_NF_TABLES_IPV6 ) -case NFPROTO_IPV6 : - sk =nf_sk_lookup_slow_v6 (nft_net (pkt), skb,nft_in (pkt)); -break ; -#endif -default : -WARN_ON_ONCE (1 ); - regs->verdict.code =NFT_BREAK ; -return ; - } + sk =nft_socket_do_lookup (pkt);if (!sk) { regs->verdict.code =NFT_BREAK ;
@@ -224,6 +237,16 @@ static bool nft_socket_reduce(struct nft_regs_track *track,return nft_expr_reduce_bitwise (track, expr); } +static int nft_socket_validate (const struct nft_ctx *ctx, +const struct nft_expr *expr, +const struct nft_data **data) +{ +return nft_chain_validate_hooks (ctx->chain, + (1 <<NF_INET_PRE_ROUTING ) | + (1 <<NF_INET_LOCAL_IN ) | + (1 <<NF_INET_LOCAL_OUT )); +} +static struct nft_expr_type nft_socket_type;static const struct nft_expr_ops nft_socket_ops = { .type = &nft_socket_type,
@@ -231,6 +254,7 @@ static const struct nft_expr_ops nft_socket_ops = { .eval = nft_socket_eval, .init = nft_socket_init, .dump = nft_socket_dump, + .validate = nft_socket_validate, .reduce = nft_socket_reduce, };