diff mbox series

[net] sfc: check for zero length in EF10 RX prefix

Message ID 20230831165811.18061-1-edward.cree@amd.com (mailing list archive)
State Accepted
Commit ae074e2b2fd410bf54d56509a7e48fb83873af3b
Delegated to: Netdev Maintainers
Headers show
Series [net] sfc: check for zero length in EF10 RX prefix | 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 fail Series targets non-next tree, but doesn't contain any Fixes tags
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1330 this patch: 1330
netdev/cc_maintainers success CCed 8 of 8 maintainers
netdev/build_clang success Errors and warnings before: 1353 this patch: 1353
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 No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 1353 this patch: 1353
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 41 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

edward.cree@amd.com Aug. 31, 2023, 4:58 p.m. UTC
From: Edward Cree <ecree.xilinx@gmail.com>

When EF10 RXDP firmware is operating in cut-through mode, packet length
 is not known at the time the RX prefix is generated, so it is left as
 zero and RX event merging is inhibited to ensure that the length is
 available in the RX event.  However, it has been found that in certain
 circumstances the RX events for these packets still get merged,
 meaning the driver cannot read the length from the RX event, and tries
 to use the length from the prefix.
The resulting zero-length SKBs cause crashes in GRO since commit
 1d11fa696733 ("net-gro: remove GRO_DROP"), so add a check to the driver
 to detect these zero-length RX events and discard the packet.

Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
---
 drivers/net/ethernet/sfc/rx.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

Eric Dumazet Aug. 31, 2023, 5:07 p.m. UTC | #1
On Thu, Aug 31, 2023 at 6:59 PM <edward.cree@amd.com> wrote:
>
> From: Edward Cree <ecree.xilinx@gmail.com>
>
> When EF10 RXDP firmware is operating in cut-through mode, packet length
>  is not known at the time the RX prefix is generated, so it is left as
>  zero and RX event merging is inhibited to ensure that the length is
>  available in the RX event.  However, it has been found that in certain
>  circumstances the RX events for these packets still get merged,
>  meaning the driver cannot read the length from the RX event, and tries
>  to use the length from the prefix.
> The resulting zero-length SKBs cause crashes in GRO since commit
>  1d11fa696733 ("net-gro: remove GRO_DROP"), so add a check to the driver
>  to detect these zero-length RX events and discard the packet.
>
> Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>

Nice bug ;)

Thanks for this fix.

Reviewed-by: Eric Dumazet <edumazet@google.com>
patchwork-bot+netdevbpf@kernel.org Sept. 1, 2023, 7:20 a.m. UTC | #2
Hello:

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

On Thu, 31 Aug 2023 17:58:11 +0100 you wrote:
> From: Edward Cree <ecree.xilinx@gmail.com>
> 
> When EF10 RXDP firmware is operating in cut-through mode, packet length
>  is not known at the time the RX prefix is generated, so it is left as
>  zero and RX event merging is inhibited to ensure that the length is
>  available in the RX event.  However, it has been found that in certain
>  circumstances the RX events for these packets still get merged,
>  meaning the driver cannot read the length from the RX event, and tries
>  to use the length from the prefix.
> The resulting zero-length SKBs cause crashes in GRO since commit
>  1d11fa696733 ("net-gro: remove GRO_DROP"), so add a check to the driver
>  to detect these zero-length RX events and discard the packet.
> 
> [...]

Here is the summary with links:
  - [net] sfc: check for zero length in EF10 RX prefix
    https://git.kernel.org/netdev/net/c/ae074e2b2fd4

You are awesome, thank you!
Jay Vosburgh Sept. 1, 2023, 8:28 p.m. UTC | #3
patchwork-bot+netdevbpf@kernel.org wrote:

>Hello:
>
>This patch was applied to netdev/net.git (main)
>by David S. Miller <davem@davemloft.net>:
>
>On Thu, 31 Aug 2023 17:58:11 +0100 you wrote:
>> From: Edward Cree <ecree.xilinx@gmail.com>
>> 
>> When EF10 RXDP firmware is operating in cut-through mode, packet length
>>  is not known at the time the RX prefix is generated, so it is left as
>>  zero and RX event merging is inhibited to ensure that the length is
>>  available in the RX event.  However, it has been found that in certain
>>  circumstances the RX events for these packets still get merged,
>>  meaning the driver cannot read the length from the RX event, and tries
>>  to use the length from the prefix.
>> The resulting zero-length SKBs cause crashes in GRO since commit
>>  1d11fa696733 ("net-gro: remove GRO_DROP"), so add a check to the driver
>>  to detect these zero-length RX events and discard the packet.
>> 
>> [...]

	Should this have included

Fixes: 1d11fa696733 ("net-gro: remove GRO_DROP")

	to queue the patch for -stable?  We have users running into this
issue on 5.15 series kernels.

	-J

---
	-Jay Vosburgh, jay.vosburgh@canonical.com
Edward Cree Sept. 4, 2023, 8:41 a.m. UTC | #4
On 01/09/2023 21:28, Jay Vosburgh wrote:
>>> The resulting zero-length SKBs cause crashes in GRO since commit
>>>  1d11fa696733 ("net-gro: remove GRO_DROP"), so add a check to the driver
>>>  to detect these zero-length RX events and discard the packet.
>>>
>>> [...]
> 
> 	Should this have included
> 
> Fixes: 1d11fa696733 ("net-gro: remove GRO_DROP")
> 
> 	to queue the patch for -stable?  We have users running into this
> issue on 5.15 series kernels.

I didn't think Fixes: was appropriate (for various abstruse reasons I
 won't go into), but this does want to go to -stable.  I expect Sasha's
 robot will select it, but feel free to submit it explicitly.

-ed
diff mbox series

Patch

diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c
index 2375cef577e4..f77a2d3ef37e 100644
--- a/drivers/net/ethernet/sfc/rx.c
+++ b/drivers/net/ethernet/sfc/rx.c
@@ -359,26 +359,36 @@  static bool efx_do_xdp(struct efx_nic *efx, struct efx_channel *channel,
 /* Handle a received packet.  Second half: Touches packet payload. */
 void __efx_rx_packet(struct efx_channel *channel)
 {
+	struct efx_rx_queue *rx_queue = efx_channel_get_rx_queue(channel);
 	struct efx_nic *efx = channel->efx;
 	struct efx_rx_buffer *rx_buf =
-		efx_rx_buffer(&channel->rx_queue, channel->rx_pkt_index);
+		efx_rx_buffer(rx_queue, channel->rx_pkt_index);
 	u8 *eh = efx_rx_buf_va(rx_buf);
 
 	/* Read length from the prefix if necessary.  This already
 	 * excludes the length of the prefix itself.
 	 */
-	if (rx_buf->flags & EFX_RX_PKT_PREFIX_LEN)
+	if (rx_buf->flags & EFX_RX_PKT_PREFIX_LEN) {
 		rx_buf->len = le16_to_cpup((__le16 *)
 					   (eh + efx->rx_packet_len_offset));
+		/* A known issue may prevent this being filled in;
+		 * if that happens, just drop the packet.
+		 * Must do that in the driver since passing a zero-length
+		 * packet up to the stack may cause a crash.
+		 */
+		if (unlikely(!rx_buf->len)) {
+			efx_free_rx_buffers(rx_queue, rx_buf,
+					    channel->rx_pkt_n_frags);
+			channel->n_rx_frm_trunc++;
+			goto out;
+		}
+	}
 
 	/* If we're in loopback test, then pass the packet directly to the
 	 * loopback layer, and free the rx_buf here
 	 */
 	if (unlikely(efx->loopback_selftest)) {
-		struct efx_rx_queue *rx_queue;
-
 		efx_loopback_rx_packet(efx, eh, rx_buf->len);
-		rx_queue = efx_channel_get_rx_queue(channel);
 		efx_free_rx_buffers(rx_queue, rx_buf,
 				    channel->rx_pkt_n_frags);
 		goto out;