fsl/fman: Validate cell-index value obtained from Device Tree

Cell-index value is obtained from Device Tree and then used to calculate
the index for accessing arrays port_mfl[], mac_mfl[] and intr_mng[].
In case of broken DT due to any error cell-index can contain any value
and it is possible to go beyond the array boundaries which can lead
at least to memory corruption.

Validate cell-index value obtained from Device Tree.

Found by Linux Verification Center (linuxtesting.org) with SVACE.

Reviewed-by: Sean Anderson <sean.anderson@seco.com>
Signed-off-by: Aleksandr Mishin <amishin@t-argos.ru>
Link: https://patch.msgid.link/20241028065824.15452-1-amishin@t-argos.ru
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Aleksandr Mishin 2024-10-28 09:58:24 +03:00 committed by Jakub Kicinski
parent d86c7a9162
commit bd50c4125c
3 changed files with 8 additions and 1 deletions

View File

@ -24,7 +24,6 @@
/* General defines */
#define FMAN_LIODN_TBL 64 /* size of LIODN table */
#define MAX_NUM_OF_MACS 10
#define FM_NUM_OF_FMAN_CTRL_EVENT_REGS 4
#define BASE_RX_PORTID 0x08
#define BASE_TX_PORTID 0x28

View File

@ -74,6 +74,9 @@
#define BM_MAX_NUM_OF_POOLS 64 /* Buffers pools */
#define FMAN_PORT_MAX_EXT_POOLS_NUM 8 /* External BM pools per Rx port */
/* General defines */
#define MAX_NUM_OF_MACS 10
struct fman; /* FMan data */
/* Enum for defining port types */

View File

@ -217,6 +217,11 @@ static int mac_probe(struct platform_device *_of_dev)
err = -EINVAL;
goto _return_dev_put;
}
if (val >= MAX_NUM_OF_MACS) {
dev_err(dev, "cell-index value is too big for %pOF\n", mac_node);
err = -EINVAL;
goto _return_dev_put;
}
priv->cell_index = (u8)val;
/* Get the MAC address */