]> git.sur5r.net Git - u-boot/blobdiff - drivers/tpm/tpm_atmel_twi.c
sf: add Gigadevice gd25q16c entry
[u-boot] / drivers / tpm / tpm_atmel_twi.c
index eba654b15dcad4d85fa06e9396be4147888ea1c4..2079ea913e4428d88e03a962c00e5a667aecbba5 100644 (file)
@@ -1,14 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Copyright (C) 2013 Guntermann & Drunck, GmbH
  *
- * Written by Dirk Eibach <eibach@gdsys.de>
- *
- * SPDX-License-Identifier:    GPL-2.0+
+ * Written by Dirk Eibach <dirk.eibach@gdsys.cc>
  */
 
 #include <common.h>
 #include <dm.h>
-#include <tpm.h>
+#include <tpm-v1.h>
 #include <i2c.h>
 #include <asm/unaligned.h>
 
@@ -106,13 +105,23 @@ static int tpm_atmel_twi_xfer(struct udevice *dev,
                udelay(100);
        }
        if (!res) {
-               *recv_len = get_unaligned_be32(recvbuf + 2);
-               if (*recv_len > 10)
+               unsigned int hdr_recv_len;
+               hdr_recv_len = get_unaligned_be32(recvbuf + 2);
+               if (hdr_recv_len < 10) {
+                       puts("tpm response header too small\n");
+                       return -1;
+               } else if (hdr_recv_len > *recv_len) {
+                       puts("tpm response length is bigger than receive buffer\n");
+                       return -1;
+               } else {
+                       *recv_len = hdr_recv_len;
 #ifndef CONFIG_DM_I2C
                        res = i2c_read(0x29, 0, 0, recvbuf, *recv_len);
 #else
                        res = dm_i2c_read(dev, 0, recvbuf, *recv_len);
 #endif
+
+               }
        }
        if (res) {
                printf("i2c_read returned %d (rlen=%d)\n", res, *recv_len);