Patch "net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-stmmac-dwmac-rk-fix-oob-read-in-rk_gmac_setup.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f0d6775ee75665c31683842302d3035ac3762183
Author: John Keeping <john@xxxxxxxxxxxx>
Date:   Tue Dec 14 19:10:09 2021 +0000

    net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
    
    [ Upstream commit 0546b224cc7717cc8a2db076b0bb069a9c430794 ]
    
    KASAN reports an out-of-bounds read in rk_gmac_setup on the line:
    
            while (ops->regs[i]) {
    
    This happens for most platforms since the regs flexible array member is
    empty, so the memory after the ops structure is being read here.  It
    seems that mostly this happens to contain zero anyway, so we get lucky
    and everything still works.
    
    To avoid adding redundant data to nearly all the ops structures, add a
    new flag to indicate whether the regs field is valid and avoid this loop
    when it is not.
    
    Fixes: 3bb3d6b1c195 ("net: stmmac: Add RK3566/RK3568 SoC support")
    Signed-off-by: John Keeping <john@xxxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 6924a6aacbd53..c469abc91fa1b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -33,6 +33,7 @@ struct rk_gmac_ops {
 	void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
+	bool regs_valid;
 	u32 regs[];
 };
 
@@ -1092,6 +1093,7 @@ static const struct rk_gmac_ops rk3568_ops = {
 	.set_to_rmii = rk3568_set_to_rmii,
 	.set_rgmii_speed = rk3568_set_gmac_speed,
 	.set_rmii_speed = rk3568_set_gmac_speed,
+	.regs_valid = true,
 	.regs = {
 		0xfe2a0000, /* gmac0 */
 		0xfe010000, /* gmac1 */
@@ -1383,7 +1385,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 	 * to be distinguished.
 	 */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (res) {
+	if (res && ops->regs_valid) {
 		int i = 0;
 
 		while (ops->regs[i]) {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux