diff mbox series

[net] net: fib: avoid warn splat in flow dissector

Message ID 20230830110043.30497-1-fw@strlen.de (mailing list archive)
State Accepted
Commit 8aae7625ff3f0bd5484d01f1b8d5af82e44bec2d
Delegated to: Netdev Maintainers
Headers show
Series [net] net: fib: avoid warn splat in flow dissector | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net
netdev/fixes_present success Fixes tag present in non-next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 3131 this patch: 3131
netdev/cc_maintainers fail 1 blamed authors not CCed: pablo@netfilter.org; 5 maintainers not CCed: kuba@kernel.org pablo@netfilter.org davem@davemloft.net pabeni@redhat.com edumazet@google.com
netdev/build_clang success Errors and warnings before: 1569 this patch: 1569
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 3293 this patch: 3293
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 22 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Florian Westphal Aug. 30, 2023, 11 a.m. UTC
New skbs allocated via nf_send_reset() have skb->dev == NULL.

fib*_rules_early_flow_dissect helpers already have a 'struct net'
argument but its not passed down to the flow dissector core, which
will then WARN as it can't derive a net namespace to use:

 WARNING: CPU: 0 PID: 0 at net/core/flow_dissector.c:1016 __skb_flow_dissect+0xa91/0x1cd0
 [..]
  ip_route_me_harder+0x143/0x330
  nf_send_reset+0x17c/0x2d0 [nf_reject_ipv4]
  nft_reject_inet_eval+0xa9/0xf2 [nft_reject_inet]
  nft_do_chain+0x198/0x5d0 [nf_tables]
  nft_do_chain_inet+0xa4/0x110 [nf_tables]
  nf_hook_slow+0x41/0xc0
  ip_local_deliver+0xce/0x110
  ..

Cc: Stanislav Fomichev <sdf@google.com>
Cc: David Ahern <dsahern@kernel.org>
Cc: Ido Schimmel <idosch@nvidia.com>
Fixes: 812fa71f0d96 ("netfilter: Dissect flow after packet mangling")
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217826
Signed-off-by: Florian Westphal <fw@strlen.de>
---
 include/net/ip6_fib.h | 5 ++++-
 include/net/ip_fib.h  | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

Comments

Ido Schimmel Aug. 30, 2023, 2:46 p.m. UTC | #1
On Wed, Aug 30, 2023 at 01:00:37PM +0200, Florian Westphal wrote:
> New skbs allocated via nf_send_reset() have skb->dev == NULL.
> 
> fib*_rules_early_flow_dissect helpers already have a 'struct net'
> argument but its not passed down to the flow dissector core, which
> will then WARN as it can't derive a net namespace to use:
> 
>  WARNING: CPU: 0 PID: 0 at net/core/flow_dissector.c:1016 __skb_flow_dissect+0xa91/0x1cd0
>  [..]
>   ip_route_me_harder+0x143/0x330
>   nf_send_reset+0x17c/0x2d0 [nf_reject_ipv4]
>   nft_reject_inet_eval+0xa9/0xf2 [nft_reject_inet]
>   nft_do_chain+0x198/0x5d0 [nf_tables]
>   nft_do_chain_inet+0xa4/0x110 [nf_tables]
>   nf_hook_slow+0x41/0xc0
>   ip_local_deliver+0xce/0x110
>   ..
> 
> Cc: Stanislav Fomichev <sdf@google.com>
> Cc: David Ahern <dsahern@kernel.org>
> Cc: Ido Schimmel <idosch@nvidia.com>
> Fixes: 812fa71f0d96 ("netfilter: Dissect flow after packet mangling")
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217826
> Signed-off-by: Florian Westphal <fw@strlen.de>

Reviewed-by: Ido Schimmel <idosch@nvidia.com>

Thanks!
David Ahern Aug. 30, 2023, 2:56 p.m. UTC | #2
On 8/30/23 5:00 AM, Florian Westphal wrote:
> New skbs allocated via nf_send_reset() have skb->dev == NULL.
> 
> fib*_rules_early_flow_dissect helpers already have a 'struct net'
> argument but its not passed down to the flow dissector core, which
> will then WARN as it can't derive a net namespace to use:
> 
>  WARNING: CPU: 0 PID: 0 at net/core/flow_dissector.c:1016 __skb_flow_dissect+0xa91/0x1cd0
>  [..]
>   ip_route_me_harder+0x143/0x330
>   nf_send_reset+0x17c/0x2d0 [nf_reject_ipv4]
>   nft_reject_inet_eval+0xa9/0xf2 [nft_reject_inet]
>   nft_do_chain+0x198/0x5d0 [nf_tables]
>   nft_do_chain_inet+0xa4/0x110 [nf_tables]
>   nf_hook_slow+0x41/0xc0
>   ip_local_deliver+0xce/0x110
>   ..
> 
> Cc: Stanislav Fomichev <sdf@google.com>
> Cc: David Ahern <dsahern@kernel.org>
> Cc: Ido Schimmel <idosch@nvidia.com>
> Fixes: 812fa71f0d96 ("netfilter: Dissect flow after packet mangling")
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=217826
> Signed-off-by: Florian Westphal <fw@strlen.de>
> ---
>  include/net/ip6_fib.h | 5 ++++-
>  include/net/ip_fib.h  | 5 ++++-
>  2 files changed, 8 insertions(+), 2 deletions(-)
> 

Reviewed-by: David Ahern <dsahern@kernel.org>
patchwork-bot+netdevbpf@kernel.org Aug. 31, 2023, 11:40 a.m. UTC | #3
Hello:

This patch was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:

On Wed, 30 Aug 2023 13:00:37 +0200 you wrote:
> New skbs allocated via nf_send_reset() have skb->dev == NULL.
> 
> fib*_rules_early_flow_dissect helpers already have a 'struct net'
> argument but its not passed down to the flow dissector core, which
> will then WARN as it can't derive a net namespace to use:
> 
>  WARNING: CPU: 0 PID: 0 at net/core/flow_dissector.c:1016 __skb_flow_dissect+0xa91/0x1cd0
>  [..]
>   ip_route_me_harder+0x143/0x330
>   nf_send_reset+0x17c/0x2d0 [nf_reject_ipv4]
>   nft_reject_inet_eval+0xa9/0xf2 [nft_reject_inet]
>   nft_do_chain+0x198/0x5d0 [nf_tables]
>   nft_do_chain_inet+0xa4/0x110 [nf_tables]
>   nf_hook_slow+0x41/0xc0
>   ip_local_deliver+0xce/0x110
>   ..
> 
> [...]

Here is the summary with links:
  - [net] net: fib: avoid warn splat in flow dissector
    https://git.kernel.org/netdev/net/c/8aae7625ff3f

You are awesome, thank you!
diff mbox series

Patch

diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h
index c9ff23cf313e..1ba9f4ddf2f6 100644
--- a/include/net/ip6_fib.h
+++ b/include/net/ip6_fib.h
@@ -642,7 +642,10 @@  static inline bool fib6_rules_early_flow_dissect(struct net *net,
 	if (!net->ipv6.fib6_rules_require_fldissect)
 		return false;
 
-	skb_flow_dissect_flow_keys(skb, flkeys, flag);
+	memset(flkeys, 0, sizeof(*flkeys));
+	__skb_flow_dissect(net, skb, &flow_keys_dissector,
+			   flkeys, NULL, 0, 0, 0, flag);
+
 	fl6->fl6_sport = flkeys->ports.src;
 	fl6->fl6_dport = flkeys->ports.dst;
 	fl6->flowi6_proto = flkeys->basic.ip_proto;
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index a378eff827c7..f0c13864180e 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -418,7 +418,10 @@  static inline bool fib4_rules_early_flow_dissect(struct net *net,
 	if (!net->ipv4.fib_rules_require_fldissect)
 		return false;
 
-	skb_flow_dissect_flow_keys(skb, flkeys, flag);
+	memset(flkeys, 0, sizeof(*flkeys));
+	__skb_flow_dissect(net, skb, &flow_keys_dissector,
+			   flkeys, NULL, 0, 0, 0, flag);
+
 	fl4->fl4_sport = flkeys->ports.src;
 	fl4->fl4_dport = flkeys->ports.dst;
 	fl4->flowi4_proto = flkeys->basic.ip_proto;