phy: ocelot-serdes: fix out-of-bounds read
Subsystems (2)
v2 cover phy: ocelot-serdes: fix out-of-bounds read
This patchset aims to fix an out-of-bounds bug in
the phy-ocelot-serdes driver.
Currently, there is an out-of-bounds read on array ctrl->phys, once variable i reaches the maximum array size of SERDES_MAX in the for loop.
Quentin Schulz pointed out that SERDES_MAX is a valid value to index ctrl->phys. So, I updated SERDES_MAX to be SERDES6G_MAX + 1 in include/dt-bindings/phy/phy-ocelot-serdes.h.
Then I changed the condition in the for loop from
i <= SERDES_MAX to i < SERDES_MAX in order to
complete the fix.
The reason I'm sending this fix as series is because checkpatch reported an error when I first tried to integrate the whole solution into a singe patch. So, changes to dt-bindings should be sent as a separate patch.
Changes in v2:
- Send the whole series to Kishon Vijay Abraham I, so it can be taken into the PHY tree.
- Add Quentin's Reviewed-by to commit log in both patches.
Thanks!
Gustavo A. R. Silva (2):
dt-bindings: phy: Update SERDES_MAX to be SERDES_MAX + 1
phy: ocelot-serdes: fix out-of-bounds read
drivers/phy/mscc/phy-ocelot-serdes.c | 4 ++-- include/dt-bindings/phy/phy-ocelot-serdes.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-)
Signature · 1 line
2.7.4
PATCH v2 1/2 dt-bindings: phy: Update SERDES_MAX to be SERDES_MAX + 1
SERDES_MAX is a valid value to index ctrl->phys in drivers/phy/mscc/phy-ocelot-serdes.c. But, currently, there is an out-of-bounds bug in the mentioned driver when reading from ctrl->phys, because the size of array ctrl->phys is SERDES_MAX.
Partially fix this by updating SERDES_MAX to be SERDES6G_MAX + 1.
Notice that this is the first part of the solution to the out-of-bounds bug mentioned above. Although this change is not dependent on any other one.
---
Changes in v2:
- Add Quentin's Reviewed-by to commit log.
- Add Rob's Acked-by to commit log.
include/dt-bindings/phy/phy-ocelot-serdes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/dt-bindings/phy/phy-ocelot-serdes.h +1 -1
@@ -7,6 +7,6 @@#define SERDES1G_MAX SERDES1G(5)#define SERDES6G (x) (SERDES1G_MAX + 1 + (x))#define SERDES6G_MAX SERDES6G(2) -#define SERDES_MAX SERDES6G_MAX +#define SERDES_MAX (SERDES6G_MAX + 1)#endif
Signature · 1 line
2.7.4
PATCH v2 2/2 phy: ocelot-serdes: fix out-of-bounds read
In reply to Gustavo A. R. SilvaCurrently, there is an out-of-bounds read on array ctrl->phys, once variable i reaches the maximum array size of SERDES_MAX in the for loop.
Fix this by changing the condition in the for loop from i <= SERDES_MAX to i < SERDES_MAX.
Addresses-Coverity-ID: 1473966 ("Out-of-bounds read")
Addresses-Coverity-ID: 1473959 ("Out-of-bounds read")
---
Changes in v2:
- Rebase and add Quentin's Reviewed-by to commit log.
drivers/phy/mscc/phy-ocelot-serdes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/phy/mscc/phy-ocelot-serdes.c +2 -2
@@ -206,7 +206,7 @@ static struct phy *serdes_simple_xlate(struct device *dev, port = args->args[0 ]; idx = args->args[1 ]; -for (i =0 ; i <=SERDES_MAX ; i++) { +for (i =0 ; i <SERDES_MAX ; i++) {struct serdes_macro *macro =phy_get_drvdata (ctrl->phys[i]);if (idx != macro->idx)
@@ -260,7 +260,7 @@ static int serdes_probe(struct platform_device *pdev)if (IS_ERR (ctrl->regs))return PTR_ERR (ctrl->regs); -for (i =0 ; i <=SERDES_MAX ; i++) { +for (i =0 ; i <SERDES_MAX ; i++) { ret =serdes_phy_create (ctrl, i, &ctrl->phys[i]);if (ret)return ret;
Signature · 1 line
2.7.4