aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Zimmerman <joshz@google.com>2016-10-27 17:50:09 -0400
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>2016-11-27 18:31:30 -0500
commit26a137e31ffe6fbfdb008554a8d9b3d55bd5c86e (patch)
treed219a64c584e644ae910aa2979d13fe95a43afbe
parentca6d45802201c2680af040579af7697049149e38 (diff)
tpm_tis: Check return values from get_burstcount.
If the TPM we're connecting to uses a static burst count, it will report a burst count of zero throughout the response read. However, get_burstcount assumes that a response of zero indicates that the TPM is not ready to receive more data. In this case, it returns a negative error code, which is passed on to tpm_tis_{write,read}_bytes as a u16, causing them to read/write far too many bytes. This patch checks for negative return codes and bails out from recv_data and tpm_tis_send_data. Cc: stable@vger.kernel.org Fixes: 1107d065fdf1 (tpm_tis: Introduce intermediate layer for TPM access) Signed-off-by: Josh Zimmerman <joshz@google.com> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
-rw-r--r--drivers/char/tpm/tpm_tis_core.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
index 73f4c4bbc4df..2d1e451fb1b3 100644
--- a/drivers/char/tpm/tpm_tis_core.c
+++ b/drivers/char/tpm/tpm_tis_core.c
@@ -187,7 +187,12 @@ static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
187 &priv->read_queue, true); 187 &priv->read_queue, true);
188 if (rc < 0) 188 if (rc < 0)
189 return rc; 189 return rc;
190 burstcnt = min_t(int, get_burstcount(chip), count - size); 190 burstcnt = get_burstcount(chip);
191 if (burstcnt < 0) {
192 dev_err(&chip->dev, "Unable to read burstcount\n");
193 return burstcnt;
194 }
195 burstcnt = min_t(int, burstcnt, count - size);
191 196
192 rc = tpm_tis_read_bytes(priv, TPM_DATA_FIFO(priv->locality), 197 rc = tpm_tis_read_bytes(priv, TPM_DATA_FIFO(priv->locality),
193 burstcnt, buf + size); 198 burstcnt, buf + size);
@@ -276,7 +281,13 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
276 } 281 }
277 282
278 while (count < len - 1) { 283 while (count < len - 1) {
279 burstcnt = min_t(int, get_burstcount(chip), len - count - 1); 284 burstcnt = get_burstcount(chip);
285 if (burstcnt < 0) {
286 dev_err(&chip->dev, "Unable to read burstcount\n");
287 rc = burstcnt;
288 goto out_err;
289 }
290 burstcnt = min_t(int, burstcnt, len - count - 1);
280 rc = tpm_tis_write_bytes(priv, TPM_DATA_FIFO(priv->locality), 291 rc = tpm_tis_write_bytes(priv, TPM_DATA_FIFO(priv->locality),
281 burstcnt, buf + count); 292 burstcnt, buf + count);
282 if (rc < 0) 293 if (rc < 0)