Skip to content
/ linux Public

Commit b690635

Browse files
avasummerSasha Levin
authored andcommitted
dpaa2-switch: validate num_ifs to prevent out-of-bounds write
[ Upstream commit 8a5752c ] The driver obtains sw_attr.num_ifs from firmware via dpsw_get_attributes() but never validates it against DPSW_MAX_IF (64). This value controls iteration in dpaa2_switch_fdb_get_flood_cfg(), which writes port indices into the fixed-size cfg->if_id[DPSW_MAX_IF] array. When firmware reports num_ifs >= 64, the loop can write past the array bounds. Add a bound check for num_ifs in dpaa2_switch_init(). dpaa2_switch_fdb_get_flood_cfg() appends the control interface (port num_ifs) after all matched ports. When num_ifs == DPSW_MAX_IF and all ports match the flood filter, the loop fills all 64 slots and the control interface write overflows by one entry. The check uses >= because num_ifs == DPSW_MAX_IF is also functionally broken. build_if_id_bitmap() silently drops any ID >= 64: if (id[i] < DPSW_MAX_IF) bmap[id[i] / 64] |= ... Fixes: 539dda3 ("staging: dpaa2-switch: properly setup switching domains") Signed-off-by: Junrui Luo <moonafterrain@outlook.com> Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com> Link: https://patch.msgid.link/SYBPR01MB78812B47B7F0470B617C408AAF74A@SYBPR01MB7881.ausprd01.prod.outlook.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 9ac6aeb commit b690635

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2998,6 +2998,13 @@ static int dpaa2_switch_init(struct fsl_mc_device *sw_dev)
29982998
goto err_close;
29992999
}
30003000

3001+
if (ethsw->sw_attr.num_ifs >= DPSW_MAX_IF) {
3002+
dev_err(dev, "DPSW num_ifs %u exceeds max %u\n",
3003+
ethsw->sw_attr.num_ifs, DPSW_MAX_IF);
3004+
err = -EINVAL;
3005+
goto err_close;
3006+
}
3007+
30013008
err = dpsw_get_api_version(ethsw->mc_io, 0,
30023009
&ethsw->major,
30033010
&ethsw->minor);

0 commit comments

Comments
 (0)