diff options
author | Hideki Iwamoto <h-iwamoto@kit.hi-ho.ne.jp> | 2005-09-25 11:01:11 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-10-28 17:02:07 -0400 |
commit | 5c50d1885981537ff3b8df6433951de6c9cb72cb (patch) | |
tree | 1440c92b1716fb27a93c96fc9494aa7980421d95 /drivers/i2c/i2c-core.c | |
parent | 0f69a612f950f7508e556bf1b09390087d112115 (diff) |
[PATCH] i2c: Several PEC-related fixes in software SMBus emulation
Fix several errors in I2C SMBus emulation when PEC is used:
* Weird logic error in SMBus Write Word transactions.
* Wrong buffer size, affecting SMBus Block Write transactions.
* Potential buffer overrun in SMBus Block Write transactions.
From: Hideki Iwamoto <h-iwamoto@kit.hi-ho.ne.jp>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/i2c/i2c-core.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r-- | drivers/i2c/i2c-core.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index b55097d57b7a..9583a54ce16b 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -864,7 +864,7 @@ static int i2c_smbus_add_pec(u16 addr, u8 command, int size, | |||
864 | break; | 864 | break; |
865 | case I2C_SMBUS_BYTE_DATA: | 865 | case I2C_SMBUS_BYTE_DATA: |
866 | buf[2] = data->byte; | 866 | buf[2] = data->byte; |
867 | data->word = buf[2] || | 867 | data->word = buf[2] | |
868 | (i2c_smbus_pec(3, buf, NULL) << 8); | 868 | (i2c_smbus_pec(3, buf, NULL) << 8); |
869 | size = I2C_SMBUS_WORD_DATA; | 869 | size = I2C_SMBUS_WORD_DATA; |
870 | break; | 870 | break; |
@@ -1033,8 +1033,8 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
1033 | need to use only one message; when reading, we need two. We initialize | 1033 | need to use only one message; when reading, we need two. We initialize |
1034 | most things with sane defaults, to keep the code below somewhat | 1034 | most things with sane defaults, to keep the code below somewhat |
1035 | simpler. */ | 1035 | simpler. */ |
1036 | unsigned char msgbuf0[34]; | 1036 | unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3]; |
1037 | unsigned char msgbuf1[34]; | 1037 | unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2]; |
1038 | int num = read_write == I2C_SMBUS_READ?2:1; | 1038 | int num = read_write == I2C_SMBUS_READ?2:1; |
1039 | struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, | 1039 | struct i2c_msg msg[2] = { { addr, flags, 1, msgbuf0 }, |
1040 | { addr, flags | I2C_M_RD, 0, msgbuf1 } | 1040 | { addr, flags | I2C_M_RD, 0, msgbuf1 } |
@@ -1097,7 +1097,7 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr, | |||
1097 | } | 1097 | } |
1098 | if(size == I2C_SMBUS_BLOCK_DATA_PEC) | 1098 | if(size == I2C_SMBUS_BLOCK_DATA_PEC) |
1099 | (msg[0].len)++; | 1099 | (msg[0].len)++; |
1100 | for (i = 1; i <= msg[0].len; i++) | 1100 | for (i = 1; i < msg[0].len; i++) |
1101 | msgbuf0[i] = data->block[i-1]; | 1101 | msgbuf0[i] = data->block[i-1]; |
1102 | } | 1102 | } |
1103 | break; | 1103 | break; |