> -----Original Message-----
> From: Matt Vollrath <[email protected]>
> Sent: Thursday, September 17, 2026 12:52 PM
> To: [email protected]
> Cc: [email protected]; Nguyen, Anthony L
> <[email protected]>; Kitszel, Przemyslaw
> <[email protected]>; Andrew Lunn <[email protected]>;
> David S . Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Jakub Kicinski <[email protected]>; Paolo Abeni
> <[email protected]>; Ben Greear <[email protected]>; Matt
> Vollrath <[email protected]>; [email protected]
> Subject: [PATCH iwl-net v2] e1000e: fix NETIF_F_RXALL buffer overrun
> 
> When SBP is set, the card may deliver frames which would otherwise be
> filtered out by LPE being unset. This would allow the device to write
> up to 526 bytes beyond the skb's data allocation: over its own shinfo,
> and beyond. This bug is reachable only when MTU <= 1500 and
> NETIF_F_RXALL is set by ethtool.
> 
> To reproduce, build a kernel with CONFIG_SLUB_DEBUG=y and boot with
> slub_debug=FZP. Enable RXALL with 'ethtool -K <iface> rx-all on'.
> Leave MTU at 1500. Directly link with a remote machine and set the
> remote link to MTU 9000. Send oversized frames from the remote machine
> with 'ping -f -M do -s 8972 -p 00'. Unload e1000e on the machine under
> test.
> Observe slub_debug faults in 'dmesg'. If IOMMU is enabled, you may
> also see IOMMU faults during pings.
> 
> Fix this by ensuring that buffers are large enough for an entire 2048
> byte chunk when NETIF_F_RXALL is set. Do this by moving final
> rx_buffer_len determination to one place, right before RCTL.BSIZE is
> determined. This will correctly re-evaluate every time the adapter is
> configured, not just on MTU change.
> 
> Signed-off-by: Matt Vollrath <[email protected]>
> Suggested-by: Jakub Kicinski <[email protected]>
> Assisted-by: Claude:claude-5-1-fable
> Fixes: cf955e6c96cb ("e1000e: Support RXALL feature flag.")
> Cc: [email protected]
> ---
> v2:
> * Don't make a new function for setting rx_buffer_len.
> * Rewording.
> * Add steps to reproduce.
> ---
>  drivers/net/ethernet/intel/e1000e/netdev.c | 41 +++++++++++----------
> -
>  1 file changed, 20 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c
> b/drivers/net/ethernet/intel/e1000e/netdev.c
> index 844f31ab37ad..f31dd5886b09 100644
> --- a/drivers/net/ethernet/intel/e1000e/netdev.c
> +++ b/drivers/net/ethernet/intel/e1000e/netdev.c
> @@ -3094,6 +3094,23 @@ static void e1000_setup_rctl(struct
> e1000_adapter *adapter)
>               e1e_wphy(hw, 22, phy_data);
>       }
> 
> +     /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically
> NET_IP_ALIGN
> +      * means we reserve 2 more, this pushes us to allocate from the
> next
> +      * larger slab size.
> +      * i.e. RXBUFFER_2048 --> size-4096 slab
> +      * However with the new *_jumbo_rx* routines, jumbo receives
> will use
> +      * fragmented skbs
> +      */
> +     if (adapter->max_frame_size <= 2048)
> +             adapter->rx_buffer_len = 2048;
> +     else
> +             adapter->rx_buffer_len = 4096;
> +
> +     /* adjust allocation if LPE protects us, and we aren't using
> SBP */
> +     if (adapter->max_frame_size <= (VLAN_ETH_FRAME_LEN +
> ETH_FCS_LEN) &&
> +         !(adapter->netdev->features & NETIF_F_RXALL))
> +             adapter->rx_buffer_len = VLAN_ETH_FRAME_LEN +
> ETH_FCS_LEN;
> +
>       /* Setup buffer sizes */
>       rctl &= ~E1000_RCTL_SZ_4096;
>       rctl |= E1000_RCTL_BSEX;
> @@ -6079,30 +6096,12 @@ static int e1000_change_mtu(struct net_device
> *netdev, int new_mtu)
> 
>       pm_runtime_get_sync(netdev->dev.parent);
> 
> -     if (netif_running(netdev))
> +     if (netif_running(netdev)) {
>               e1000e_down(adapter, true);
> -
> -     /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically
> NET_IP_ALIGN
> -      * means we reserve 2 more, this pushes us to allocate from the
> next
> -      * larger slab size.
> -      * i.e. RXBUFFER_2048 --> size-4096 slab
> -      * However with the new *_jumbo_rx* routines, jumbo receives
> will use
> -      * fragmented skbs
> -      */
> -
> -     if (max_frame <= 2048)
> -             adapter->rx_buffer_len = 2048;
> -     else
> -             adapter->rx_buffer_len = 4096;
> -
> -     /* adjust allocation if LPE protects us, and we aren't using
> SBP */
> -     if (max_frame <= (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN))
> -             adapter->rx_buffer_len = VLAN_ETH_FRAME_LEN +
> ETH_FCS_LEN;
> -
> -     if (netif_running(netdev))
>               e1000e_up(adapter);
> -     else
> +     } else {
>               e1000e_reset(adapter);
> +     }
> 
>       pm_runtime_put_sync(netdev->dev.parent);
> 
> --
> 2.43.0

Reviewed-by: Aleksandr Loktionov <[email protected]>

Reply via email to