aboutsummaryrefslogtreecommitdiff
path: root/drivers/phy/marvell
diff options
context:
space:
mode:
authorGravatar Mikhail Kobuk <m.kobuk@ispras.ru> 2024-03-21 19:47:30 +0300
committerGravatar Vinod Koul <vkoul@kernel.org> 2024-04-05 22:32:00 +0530
commite4308bc22b9d46cf33165c9dfaeebcf29cd56f04 (patch)
treee1455e0ca616c700102af2735904bcf1d8d000b2 /drivers/phy/marvell
parentLinux 6.9-rc1 (diff)
downloadlinux-e4308bc22b9d46cf33165c9dfaeebcf29cd56f04.tar.gz
linux-e4308bc22b9d46cf33165c9dfaeebcf29cd56f04.tar.bz2
linux-e4308bc22b9d46cf33165c9dfaeebcf29cd56f04.zip
phy: marvell: a3700-comphy: Fix out of bounds read
There is an out of bounds read access of 'gbe_phy_init_fix[fix_idx].addr' every iteration after 'fix_idx' reaches 'ARRAY_SIZE(gbe_phy_init_fix)'. Make sure 'gbe_phy_init[addr]' is used when all elements of 'gbe_phy_init_fix' array are handled. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 934337080c6c ("phy: marvell: phy-mvebu-a3700-comphy: Add native kernel implementation") Signed-off-by: Mikhail Kobuk <m.kobuk@ispras.ru> Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/r/20240321164734.49273-1-m.kobuk@ispras.ru Signed-off-by: Vinod Koul <vkoul@kernel.org>
Diffstat (limited to 'drivers/phy/marvell')
-rw-r--r--drivers/phy/marvell/phy-mvebu-a3700-comphy.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
index 41162d7228c9..68710ad1ad70 100644
--- a/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
+++ b/drivers/phy/marvell/phy-mvebu-a3700-comphy.c
@@ -611,11 +611,12 @@ static void comphy_gbe_phy_init(struct mvebu_a3700_comphy_lane *lane,
* comparison to 3.125 Gbps values. These register values are
* stored in "gbe_phy_init_fix" array.
*/
- if (!is_1gbps && gbe_phy_init_fix[fix_idx].addr == addr) {
+ if (!is_1gbps &&
+ fix_idx < ARRAY_SIZE(gbe_phy_init_fix) &&
+ gbe_phy_init_fix[fix_idx].addr == addr) {
/* Use new value */
val = gbe_phy_init_fix[fix_idx].value;
- if (fix_idx < ARRAY_SIZE(gbe_phy_init_fix))
- fix_idx++;
+ fix_idx++;
} else {
val = gbe_phy_init[addr];
}