]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
i2c: smbus: fix a potential uninitialization bug
authorWenwen Wang <wang6495@umn.edu>
Sat, 5 May 2018 12:57:10 +0000 (07:57 -0500)
committerWolfram Sang <wsa+renesas@sang-engineering.com>
Tue, 19 May 2026 10:43:08 +0000 (12:43 +0200)
In i2c_smbus_xfer_emulated(), there are two buffers: msgbuf0 and
msgbuf1, which are used to save a series of messages, as mentioned in
the comment. According to the value of the variable 'size', msgbuf0 is
initialized to various values. In contrast, msgbuf1 is left
uninitialized until the function i2c_transfer() is invoked. However,
msgbuf1 is not always initialized on all possible execution paths
(implementation) of i2c_transfer(). Thus, it is possible that msgbuf1
may still be uninitialized even after the invocation of the function
i2c_transfer(), especially when the return value of i2c_transfer() is
not checked properly. In the following execution, the uninitialized
msgbuf1 will be used, such as for security checks. Since uninitialized
values can be random and arbitrary, this will cause undefined behaviors
or even check bypass. For example, it is expected that if the value of
'size' is I2C_SMBUS_BLOCK_PROC_CALL, the value of data->block[0] should
not be larger than I2C_SMBUS_BLOCK_MAX. This patch initializes the first
byte of msgbuf1 with 0 to avoid such undefined behaviors or security
issues.

Signed-off-by: Wenwen Wang <wang6495@umn.edu>
[wsa: reworded commit message a little]
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
drivers/i2c/i2c-core-smbus.c

index ad6acb5ebadc32eb6b1c76ad53ac9068ece83217..fa63bee0b345dc6ea06f18a6f0e97bb726083e57 100644 (file)
@@ -353,6 +353,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
                          && size != I2C_SMBUS_I2C_BLOCK_DATA);
 
        msgbuf0[0] = command;
+       msgbuf1[0] = 0;
        switch (size) {
        case I2C_SMBUS_QUICK:
                msg[0].len = 0;