Skip to content

Commit 2e36c9f

Browse files
pbrkrPaolo Abeni
authored andcommitted
net: ravb: Fix RX byte accounting for jumbo packets
The RX byte accounting for jumbo packets was changed to fix a potential use-after-free bug. However, that fix used the wrong variable and so only accounted for the number of bytes in the final descriptor, not the number of bytes in the whole packet. To fix this, we can simply update our stats with the correct number of bytes before calling napi_gro_receive(). Also rename pkt_len to desc_len in ravb_rx_gbeth() to avoid any future confusion. The variable name pkt_len is correct in ravb_rx_rcar() as that function does not handle packets spanning multiple descriptors. Fixes: 5a5a3e5 ("ravb: Fix potential use-after-free in ravb_rx_gbeth()") Signed-off-by: Paul Barker <[email protected]> Reviewed-by: Sergey Shtylyov <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent c7c4495 commit 2e36c9f

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

drivers/net/ethernet/renesas/ravb_main.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -769,7 +769,7 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
769769
dma_addr_t dma_addr;
770770
int rx_packets = 0;
771771
u8 desc_status;
772-
u16 pkt_len;
772+
u16 desc_len;
773773
u8 die_dt;
774774
int entry;
775775
int limit;
@@ -787,10 +787,10 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
787787
/* Descriptor type must be checked before all other reads */
788788
dma_rmb();
789789
desc_status = desc->msc;
790-
pkt_len = le16_to_cpu(desc->ds_cc) & RX_DS;
790+
desc_len = le16_to_cpu(desc->ds_cc) & RX_DS;
791791

792792
/* We use 0-byte descriptors to mark the DMA mapping errors */
793-
if (!pkt_len)
793+
if (!desc_len)
794794
continue;
795795

796796
if (desc_status & MSC_MC)
@@ -811,43 +811,43 @@ static bool ravb_rx_gbeth(struct net_device *ndev, int *quota, int q)
811811
switch (die_dt) {
812812
case DT_FSINGLE:
813813
skb = ravb_get_skb_gbeth(ndev, entry, desc);
814-
skb_put(skb, pkt_len);
814+
skb_put(skb, desc_len);
815815
skb->protocol = eth_type_trans(skb, ndev);
816816
if (ndev->features & NETIF_F_RXCSUM)
817817
ravb_rx_csum_gbeth(skb);
818818
napi_gro_receive(&priv->napi[q], skb);
819819
rx_packets++;
820-
stats->rx_bytes += pkt_len;
820+
stats->rx_bytes += desc_len;
821821
break;
822822
case DT_FSTART:
823823
priv->rx_1st_skb = ravb_get_skb_gbeth(ndev, entry, desc);
824-
skb_put(priv->rx_1st_skb, pkt_len);
824+
skb_put(priv->rx_1st_skb, desc_len);
825825
break;
826826
case DT_FMID:
827827
skb = ravb_get_skb_gbeth(ndev, entry, desc);
828828
skb_copy_to_linear_data_offset(priv->rx_1st_skb,
829829
priv->rx_1st_skb->len,
830830
skb->data,
831-
pkt_len);
832-
skb_put(priv->rx_1st_skb, pkt_len);
831+
desc_len);
832+
skb_put(priv->rx_1st_skb, desc_len);
833833
dev_kfree_skb(skb);
834834
break;
835835
case DT_FEND:
836836
skb = ravb_get_skb_gbeth(ndev, entry, desc);
837837
skb_copy_to_linear_data_offset(priv->rx_1st_skb,
838838
priv->rx_1st_skb->len,
839839
skb->data,
840-
pkt_len);
841-
skb_put(priv->rx_1st_skb, pkt_len);
840+
desc_len);
841+
skb_put(priv->rx_1st_skb, desc_len);
842842
dev_kfree_skb(skb);
843843
priv->rx_1st_skb->protocol =
844844
eth_type_trans(priv->rx_1st_skb, ndev);
845845
if (ndev->features & NETIF_F_RXCSUM)
846846
ravb_rx_csum_gbeth(priv->rx_1st_skb);
847+
stats->rx_bytes += priv->rx_1st_skb->len;
847848
napi_gro_receive(&priv->napi[q],
848849
priv->rx_1st_skb);
849850
rx_packets++;
850-
stats->rx_bytes += pkt_len;
851851
break;
852852
}
853853
}

0 commit comments

Comments
 (0)