mfd: mt6360: add bound check in regmap read/write function
Subsystems (3)
PATCH v2 1/1 mfd: mt6360: add bound check in regmap read/write function
From: ChiYuan Huang <[email protected]>
Fix the potential risk for null pointer if bank index is over the maximum.
Refer to the discussion list for the experiment result on mt6370.
https://lore.kernel.org/all/[email protected]/
If not to check the bound, there is the same issue on mt6360.
---
Since v2:
- Assign i2c bank variable after bank index is already checked.
--- drivers/mfd/mt6360-core.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/mfd/mt6360-core.c +12 -2
@@ -402,7 +402,7 @@ static int mt6360_regmap_read(void *context, const void *reg, size_t reg_size,struct mt6360_ddata *ddata = context;u8 bank = *(u8 *)reg;u8 reg_addr = *(u8 *)(reg +1 ); -struct i2c_client *i2c = ddata->i2c[bank]; +struct i2c_client *i2c;bool crc_needed = false;u8 *buf;int buf_len =MT6360_ALLOC_READ_SIZE (val_size);
@@ -410,6 +410,11 @@ static int mt6360_regmap_read(void *context, const void *reg, size_t reg_size,u8 crc;int ret; +if (bank >=MT6360_SLAVE_MAX ) +return -EINVAL ; + + i2c = ddata->i2c[bank]; +if (bank ==MT6360_SLAVE_PMIC || bank ==MT6360_SLAVE_LDO ) { crc_needed = true; ret =mt6360_xlate_pmicldo_addr (®_addr, val_size);
@@ -453,13 +458,18 @@ static int mt6360_regmap_write(void *context, const void *val, size_t val_size)struct mt6360_ddata *ddata = context;u8 bank = *(u8 *)val;u8 reg_addr = *(u8 *)(val +1 ); -struct i2c_client *i2c = ddata->i2c[bank]; +struct i2c_client *i2c;bool crc_needed = false;u8 *buf;int buf_len =MT6360_ALLOC_WRITE_SIZE (val_size);int write_size = val_size -MT6360_REGMAP_REG_BYTE_SIZE ;int ret; +if (bank >=MT6360_SLAVE_MAX ) +return -EINVAL ; + + i2c = ddata->i2c[bank]; +if (bank ==MT6360_SLAVE_PMIC || bank ==MT6360_SLAVE_LDO ) { crc_needed = true; ret =mt6360_xlate_pmicldo_addr (®_addr, val_size -MT6360_REGMAP_REG_BYTE_SIZE );
Signature · 1 line
2.7.4
Hi,
cy_huang <[email protected]> 於 2022年9月29日 週四 上午10:00寫道:
Quoted 12 lines
From: ChiYuan Huang <[email protected]>
Fix the potential risk for null pointer if bank index is over the maximum.
Refer to the discussion list for the experiment result on mt6370.
https://lore.kernel.org/all/[email protected]/
If not to check the bound, there is the same issue on mt6360.Fixes 3b0850440a06c (mfd: mt6360: Merge different sub-devices I2C read/write)Signed-off-by ChiYuan Huang <[email protected]>
Quoted 8 lines
---
Since v2:
- Assign i2c bank variable after bank index is already checked.--- drivers/mfd/mt6360-core.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
Any comment?
Quoted 48 lines
drivers/mfd/mt6360-core.c +12
-3@@ -402,7 +402,7 @@ static int mt6360_regmap_read(void *context, const void *reg, size_t reg_size,struct mt6360_ddata *ddata = context;u8 bank = *(u8 *)reg;u8 reg_addr = *(u8 *)(reg +1 ); -struct i2c_client *i2c = ddata->i2c[bank]; +struct i2c_client *i2c;bool crc_needed = false;u8 *buf;int buf_len =MT6360_ALLOC_READ_SIZE (val_size);@@ -410,6 +410,11 @@ static int mt6360_regmap_read(void *context, const void *reg, size_t reg_size,u8 crc;int ret; +if (bank >=MT6360_SLAVE_MAX ) +return -EINVAL ; + + i2c = ddata->i2c[bank]; +if (bank ==MT6360_SLAVE_PMIC || bank ==MT6360_SLAVE_LDO ) { crc_needed = true; ret =mt6360_xlate_pmicldo_addr (®_addr, val_size);@@ -453,13 +458,18 @@ static int mt6360_regmap_write(void *context, const void *val, size_t val_size)struct mt6360_ddata *ddata = context;u8 bank = *(u8 *)val;u8 reg_addr = *(u8 *)(val +1 ); -struct i2c_client *i2c = ddata->i2c[bank]; +struct i2c_client *i2c;bool crc_needed = false;u8 *buf;int buf_len =MT6360_ALLOC_WRITE_SIZE (val_size);int write_size = val_size -MT6360_REGMAP_REG_BYTE_SIZE ;int ret; +if (bank >=MT6360_SLAVE_MAX ) +return -EINVAL ; + + i2c = ddata->i2c[bank]; +if (bank ==MT6360_SLAVE_PMIC || bank ==MT6360_SLAVE_LDO ) { crc_needed = true; ret =mt6360_xlate_pmicldo_addr (®_addr, val_size -MT6360_REGMAP_REG_BYTE_SIZE ); --2.7.4
Quoted 11 lines · cy_huang
From: ChiYuan Huang <[email protected]>
Fix the potential risk for null pointer if bank index is over the maximum.
Refer to the discussion list for the experiment result on mt6370.
https://lore.kernel.org/all/[email protected]/
If not to check the bound, there is the same issue on mt6360.Fixes 3b0850440a06c (mfd: mt6360: Merge different sub-devices I2C read/write)Signed-off-by ChiYuan Huang <[email protected]>
Quoted 7 lines
---
Since v2:
- Assign i2c bank variable after bank index is already checked.--- drivers/mfd/mt6360-core.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
Applied, thanks.
Signature · 1 line
Lee Jones [李琼斯]