aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tpm
diff options
context:
space:
mode:
authorPeter Huewe <PeterHuewe@gmx.de>2013-10-29 19:54:20 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-02-06 14:08:15 -0500
commit9bf4d6c3c302830f7d7ffec5f6f12948e2f53c9a (patch)
tree2667b550ddeb880bfa8bea9481b7aa85ba799d0e /drivers/char/tpm
parent3cf79a3cd9edc63a419ce3134ddc5b39575b0cdb (diff)
tpm/tpm_i2c_stm_st33: Check return code of get_burstcount
commit 85c5e0d451125c6ddb78663972e40af810b83644 upstream. The 'get_burstcount' function can in some circumstances 'return -EBUSY' which in tpm_stm_i2c_send is stored in an 'u32 burstcnt' thus converting the signed value into an unsigned value, resulting in 'burstcnt' being huge. Changing the type to u32 only does not solve the problem as the signed value is converted to an unsigned in I2C_WRITE_DATA, resulting in the same effect. Thus -> Change type of burstcnt to u32 (the return type of get_burstcount) -> Add a check for the return value of 'get_burstcount' and propagate a potential error. This makes also sense in the 'I2C_READ_DATA' case, where the there is no signed/unsigned conversion. found by coverity Signed-off-by: Peter Huewe <peterhuewe@gmx.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/char/tpm')
-rw-r--r--drivers/char/tpm/tpm_i2c_stm_st33.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/char/tpm/tpm_i2c_stm_st33.c b/drivers/char/tpm/tpm_i2c_stm_st33.c
index 5bb8e2ddd3b3..156bd3c72770 100644
--- a/drivers/char/tpm/tpm_i2c_stm_st33.c
+++ b/drivers/char/tpm/tpm_i2c_stm_st33.c
@@ -410,6 +410,8 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
410 &chip->vendor.read_queue) 410 &chip->vendor.read_queue)
411 == 0) { 411 == 0) {
412 burstcnt = get_burstcount(chip); 412 burstcnt = get_burstcount(chip);
413 if (burstcnt < 0)
414 return burstcnt;
413 len = min_t(int, burstcnt, count - size); 415 len = min_t(int, burstcnt, count - size);
414 I2C_READ_DATA(client, TPM_DATA_FIFO, buf + size, len); 416 I2C_READ_DATA(client, TPM_DATA_FIFO, buf + size, len);
415 size += len; 417 size += len;
@@ -451,7 +453,8 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)
451static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf, 453static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
452 size_t len) 454 size_t len)
453{ 455{
454 u32 status, burstcnt = 0, i, size; 456 u32 status, i, size;
457 int burstcnt = 0;
455 int ret; 458 int ret;
456 u8 data; 459 u8 data;
457 struct i2c_client *client; 460 struct i2c_client *client;
@@ -482,6 +485,8 @@ static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
482 485
483 for (i = 0; i < len - 1;) { 486 for (i = 0; i < len - 1;) {
484 burstcnt = get_burstcount(chip); 487 burstcnt = get_burstcount(chip);
488 if (burstcnt < 0)
489 return burstcnt;
485 size = min_t(int, len - i - 1, burstcnt); 490 size = min_t(int, len - i - 1, burstcnt);
486 ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size); 491 ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size);
487 if (ret < 0) 492 if (ret < 0)