public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v3] liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet
@ 2024-06-05 10:11 Aleksandr Mishin
  2024-06-07 13:32 ` patchwork-bot+netdevbpf
  0 siblings, 1 reply; 2+ messages in thread
From: Aleksandr Mishin @ 2024-06-05 10:11 UTC (permalink / raw)
  To: David S. Miller
  Cc: Aleksandr Mishin, Simon Horman, Eric Dumazet, Jakub Kicinski,
	Paolo Abeni, Kees Cook, Justin Stitt, Felix Manlunas,
	Satanand Burla, Raghu Vatsavayi, Vijaya Mohan Guvva, netdev,
	linux-kernel, lvc-project

In lio_vf_rep_copy_packet() pg_info->page is compared to a NULL value,
but then it is unconditionally passed to skb_add_rx_frag() which looks
strange and could lead to null pointer dereference.

lio_vf_rep_copy_packet() call trace looks like:
	octeon_droq_process_packets
	 octeon_droq_fast_process_packets
	  octeon_droq_dispatch_pkt
	   octeon_create_recv_info
	    ...search in the dispatch_list...
	     ->disp_fn(rdisp->rinfo, ...)
	      lio_vf_rep_pkt_recv(struct octeon_recv_info *recv_info, ...)
In this path there is no code which sets pg_info->page to NULL.
So this check looks unneeded and doesn't solve potential problem.
But I guess the author had reason to add a check and I have no such card
and can't do real test.
In addition, the code in the function liquidio_push_packet() in
liquidio/lio_core.c does exactly the same.

Based on this, I consider the most acceptable compromise solution to
adjust this issue by moving skb_add_rx_frag() into conditional scope.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Fixes: 1f233f327913 ("liquidio: switchdev support for LiquidIO NIC")
Signed-off-by: Aleksandr Mishin <amishin@t-argos.ru>
Reviewed-by: Simon Horman <horms@kernel.org>
---
v1->v2: Fix incorrect 'Fixes' tag format
v2->v3: Add explanation why this should be fixed,
 add Reviewed-by: Simon Horman <horms@kernel.org>
 (https://lore.kernel.org/all/20240308201911.GB603911@kernel.org/)

 drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
index aa6c0dfb6f1c..e26b4ed33dc8 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
@@ -272,13 +272,12 @@ lio_vf_rep_copy_packet(struct octeon_device *oct,
 				pg_info->page_offset;
 			memcpy(skb->data, va, MIN_SKB_SIZE);
 			skb_put(skb, MIN_SKB_SIZE);
+			skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
+					pg_info->page,
+					pg_info->page_offset + MIN_SKB_SIZE,
+					len - MIN_SKB_SIZE,
+					LIO_RXBUFFER_SZ);
 		}
-
-		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
-				pg_info->page,
-				pg_info->page_offset + MIN_SKB_SIZE,
-				len - MIN_SKB_SIZE,
-				LIO_RXBUFFER_SZ);
 	} else {
 		struct octeon_skb_page_info *pg_info =
 			((struct octeon_skb_page_info *)(skb->cb));
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH net v3] liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet
  2024-06-05 10:11 [PATCH net v3] liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet Aleksandr Mishin
@ 2024-06-07 13:32 ` patchwork-bot+netdevbpf
  0 siblings, 0 replies; 2+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-06-07 13:32 UTC (permalink / raw)
  To: Aleksandr Mishin
  Cc: davem, horms, edumazet, kuba, pabeni, keescook, justinstitt,
	felix.manlunas, satananda.burla, raghu.vatsavayi, vijaya.guvva,
	netdev, linux-kernel, lvc-project

Hello:

This patch was applied to netdev/net.git (main)
by David S. Miller <davem@davemloft.net>:

On Wed, 5 Jun 2024 13:11:35 +0300 you wrote:
> In lio_vf_rep_copy_packet() pg_info->page is compared to a NULL value,
> but then it is unconditionally passed to skb_add_rx_frag() which looks
> strange and could lead to null pointer dereference.
> 
> lio_vf_rep_copy_packet() call trace looks like:
> 	octeon_droq_process_packets
> 	 octeon_droq_fast_process_packets
> 	  octeon_droq_dispatch_pkt
> 	   octeon_create_recv_info
> 	    ...search in the dispatch_list...
> 	     ->disp_fn(rdisp->rinfo, ...)
> 	      lio_vf_rep_pkt_recv(struct octeon_recv_info *recv_info, ...)
> In this path there is no code which sets pg_info->page to NULL.
> So this check looks unneeded and doesn't solve potential problem.
> But I guess the author had reason to add a check and I have no such card
> and can't do real test.
> In addition, the code in the function liquidio_push_packet() in
> liquidio/lio_core.c does exactly the same.
> 
> [...]

Here is the summary with links:
  - [net,v3] liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet
    https://git.kernel.org/netdev/net/c/c44711b78608

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-06-07 13:32 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-05 10:11 [PATCH net v3] liquidio: Adjust a NULL pointer handling path in lio_vf_rep_copy_packet Aleksandr Mishin
2024-06-07 13:32 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox