drivers/char/tpm/tpm_infineon.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Ensure tpm_inf_recv() does not overflow the provided buffer when
the TPM reports more data than the caller expects.
Signed-off-by: Shahriyar Jalayeri <shahriyar@posteo.de>
---
drivers/char/tpm/tpm_infineon.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c
index 7638b65b8..eb6dd55ff 100644
--- a/drivers/char/tpm/tpm_infineon.c
+++ b/drivers/char/tpm/tpm_infineon.c
@@ -250,6 +250,12 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
number_of_wtx = 0;
recv_begin:
+ if (count < 4) {
+ dev_err(&chip->dev,
+ "count less than the header size!\n");
+ return -EIO;
+ }
+
/* start receiving header */
for (i = 0; i < 4; i++) {
ret = wait(chip, STAT_RDA);
@@ -268,6 +274,12 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
/* size of the data received */
size = ((buf[2] << 8) | buf[3]);
+ if (size > count) {
+ dev_err(&chip->dev,
+ "Buffer too small for incoming data!\n");
+ return -EIO;
+ }
+
for (i = 0; i < size; i++) {
wait(chip, STAT_RDA);
buf[i] = tpm_data_in(RDFIFO);
--
2.43.0
On Fri, Oct 03, 2025 at 09:25:47AM +0000, Shahriyar Jalayeri wrote:
> Ensure tpm_inf_recv() does not overflow the provided buffer when
> the TPM reports more data than the caller expects.
>
> Signed-off-by: Shahriyar Jalayeri <shahriyar@posteo.de>
missing:
Fixes: ebb81fdb3dd0 ("[PATCH] tpm: Support for Infineon TPM")
> ---
> drivers/char/tpm/tpm_infineon.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c
> index 7638b65b8..eb6dd55ff 100644
> --- a/drivers/char/tpm/tpm_infineon.c
> +++ b/drivers/char/tpm/tpm_infineon.c
> @@ -250,6 +250,12 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
> number_of_wtx = 0;
>
> recv_begin:
> + if (count < 4) {
> + dev_err(&chip->dev,
> + "count less than the header size!\n");
> + return -EIO;
> + }
Please remove dev_err()
> +
> /* start receiving header */
> for (i = 0; i < 4; i++) {
> ret = wait(chip, STAT_RDA);
> @@ -268,6 +274,12 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
> /* size of the data received */
> size = ((buf[2] << 8) | buf[3]);
>
> + if (size > count) {
> + dev_err(&chip->dev,
> + "Buffer too small for incoming data!\n");
> + return -EIO;
> + }
Ditto
>
> for (i = 0; i < size; i++) {
> wait(chip, STAT_RDA);
> buf[i] = tpm_data_in(RDFIFO);
> --
> 2.43.0
BR, Jarkko
Dear Shahriyar,
Thank you for your patch.
Am 03.10.25 um 11:25 schrieb Shahriyar Jalayeri:
> Ensure tpm_inf_recv() does not overflow the provided buffer when
> the TPM reports more data than the caller expects.
Is it possible to enforce this situation to ensure your patch works?
> Signed-off-by: Shahriyar Jalayeri <shahriyar@posteo.de>
> ---
> drivers/char/tpm/tpm_infineon.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/drivers/char/tpm/tpm_infineon.c b/drivers/char/tpm/tpm_infineon.c
> index 7638b65b8..eb6dd55ff 100644
> --- a/drivers/char/tpm/tpm_infineon.c
> +++ b/drivers/char/tpm/tpm_infineon.c
> @@ -250,6 +250,12 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
> number_of_wtx = 0;
>
> recv_begin:
> + if (count < 4) {
> + dev_err(&chip->dev,
> + "count less than the header size!\n");
Mention both values count and 4?
> + return -EIO;
> + }
> +
This is not described in the commit message.
> /* start receiving header */
> for (i = 0; i < 4; i++) {
> ret = wait(chip, STAT_RDA);
> @@ -268,6 +274,12 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
> /* size of the data received */
> size = ((buf[2] << 8) | buf[3]);
>
> + if (size > count) {
> + dev_err(&chip->dev,
> + "Buffer too small for incoming data!\n");
I’d log both values, and also specify that the operation is aborted.
> + return -EIO;
> + }
> +
> for (i = 0; i < size; i++) {
> wait(chip, STAT_RDA);
> buf[i] = tpm_data_in(RDFIFO);
Kind regards,
Paul
Dear Paul, > > Is it possible to enforce this situation to ensure your patch works? > Triggering the issue requires interposing the hardware or a MCU to emulate the TPM and send malformed TPM replies, I might be able to test this using Qemu, but that takes some time. For the rest of your suggestions, I'll send another patch. BR, /shj
© 2016 - 2025 Red Hat, Inc.