diff options
author | Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com> | 2022-06-08 14:26:09 +0200 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2022-06-09 10:55:46 +0200 |
commit | 381583845d19cb4bd21c8193449385f3fefa9caf (patch) | |
tree | 5811e31e13ed7e4d8b8339009fbf5ca05e56ffdd /drivers/hid/hid-cp2112.c | |
parent | HID: hid-input: add Surface Go battery quirk (diff) | |
download | linux-381583845d19cb4bd21c8193449385f3fefa9caf.tar.xz linux-381583845d19cb4bd21c8193449385f3fefa9caf.zip |
HID: cp2112: prevent a buffer overflow in cp2112_xfer()
Smatch warnings:
drivers/hid/hid-cp2112.c:793 cp2112_xfer() error: __memcpy()
'data->block[1]' too small (33 vs 255)
drivers/hid/hid-cp2112.c:793 cp2112_xfer() error: __memcpy() 'buf' too
small (64 vs 255)
The 'read_length' variable is provided by 'data->block[0]' which comes
from user and it(read_length) can take a value between 0-255. Add an
upper bound to 'read_length' variable to prevent a buffer overflow in
memcpy().
Fixes: 542134c0375b ("HID: cp2112: Fix I2C_BLOCK_DATA transactions")
Signed-off-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-cp2112.c')
-rw-r--r-- | drivers/hid/hid-cp2112.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c index ece147d1a278..1e16b0fa310d 100644 --- a/drivers/hid/hid-cp2112.c +++ b/drivers/hid/hid-cp2112.c @@ -790,6 +790,11 @@ static int cp2112_xfer(struct i2c_adapter *adap, u16 addr, data->word = le16_to_cpup((__le16 *)buf); break; case I2C_SMBUS_I2C_BLOCK_DATA: + if (read_length > I2C_SMBUS_BLOCK_MAX) { + ret = -EINVAL; + goto power_normal; + } + memcpy(data->block + 1, buf, read_length); break; case I2C_SMBUS_BLOCK_DATA: |