diff options
Diffstat (limited to 'drivers/i2c/i2c-core-smbus.c')
| -rw-r--r-- | drivers/i2c/i2c-core-smbus.c | 13 | 
1 files changed, 7 insertions, 6 deletions
| diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c index 4bb9927afd01..a1082c04ac5c 100644 --- a/drivers/i2c/i2c-core-smbus.c +++ b/drivers/i2c/i2c-core-smbus.c @@ -397,16 +397,17 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,  				   the underlying bus driver */  		break;  	case I2C_SMBUS_I2C_BLOCK_DATA: +		if (data->block[0] > I2C_SMBUS_BLOCK_MAX) { +			dev_err(&adapter->dev, "Invalid block %s size %d\n", +				read_write == I2C_SMBUS_READ ? "read" : "write", +				data->block[0]); +			return -EINVAL; +		} +  		if (read_write == I2C_SMBUS_READ) {  			msg[1].len = data->block[0];  		} else {  			msg[0].len = data->block[0] + 1; -			if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) { -				dev_err(&adapter->dev, -					"Invalid block write size %d\n", -					data->block[0]); -				return -EINVAL; -			}  			for (i = 1; i <= data->block[0]; i++)  				msgbuf0[i] = data->block[i];  		} |