diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c index af0459a79899..6f9fda758eb7 100644 --- a/drivers/net/wireless/realtek/rtw88/sdio.c +++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -969,13 +969,20 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) rx_desc = skb->data; chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status); - pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz + - pkt_stat.shift; + pkt_offset = pkt_desc_sz; + if (!pkt_stat->is_c2h) + pkt_offset += pkt_stat.drv_info_sz + pkt_stat.shift; curr_pkt_len = ALIGN(pkt_offset + pkt_stat.pkt_len, RTW_SDIO_DATA_PTR_ALIGN); - if ((curr_pkt_len + pkt_desc_sz) >= rx_len) { + if ((curr_pkt_len + pkt_desc_sz) > rx_len) { + dev_warn(rtwdev->dev, "Invalid RX packet size!"); + dev_kfree_skb_any(skb); + return; + } + + if ((curr_pkt_len + pkt_desc_sz) == rx_len) { /* Use the original skb (with it's adjusted offset) * when processing the last (or even the only) entry to * have it's memory freed automatically.