Skip to content

Commit 667462c

Browse files
KenMilmoreroxanan1996
authored andcommitted
r8169: Fix possible ring buffer corruption on fragmented Tx packets.
BugLink: https://bugs.launchpad.net/bugs/2072617 commit c71e3a5 upstream. An issue was found on the RTL8125b when transmitting small fragmented packets, whereby invalid entries were inserted into the transmit ring buffer, subsequently leading to calls to dma_unmap_single() with a null address. This was caused by rtl8169_start_xmit() not noticing changes to nr_frags which may occur when small packets are padded (to work around hardware quirks) in rtl8169_tso_csum_v2(). To fix this, postpone inspecting nr_frags until after any padding has been applied. Fixes: 9020845 ("r8169: improve rtl8169_start_xmit") Cc: stable@vger.kernel.org Signed-off-by: Ken Milmore <ken.milmore@gmail.com> Reviewed-by: Heiner Kallweit <hkallweit1@gmail.com> Link: https://lore.kernel.org/r/27ead18b-c23d-4f49-a020-1fc482c5ac95@gmail.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Portia Stephens <portia.stephens@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent 86b5fe8 commit 667462c

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

drivers/net/ethernet/realtek/r8169_main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4287,11 +4287,11 @@ static void rtl8169_doorbell(struct rtl8169_private *tp)
42874287
static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
42884288
struct net_device *dev)
42894289
{
4290-
unsigned int frags = skb_shinfo(skb)->nr_frags;
42914290
struct rtl8169_private *tp = netdev_priv(dev);
42924291
unsigned int entry = tp->cur_tx % NUM_TX_DESC;
42934292
struct TxDesc *txd_first, *txd_last;
42944293
bool stop_queue, door_bell;
4294+
unsigned int frags;
42954295
u32 opts[2];
42964296

42974297
if (unlikely(!rtl_tx_slots_avail(tp))) {
@@ -4314,6 +4314,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
43144314

43154315
txd_first = tp->TxDescArray + entry;
43164316

4317+
frags = skb_shinfo(skb)->nr_frags;
43174318
if (frags) {
43184319
if (rtl8169_xmit_frags(tp, skb, opts, entry))
43194320
goto err_dma_1;

0 commit comments

Comments
 (0)