TPM: fix transmit_cmd error logic
authorRajiv Andrade <srajiv@linux.vnet.ibm.com>
Tue, 1 Nov 2011 19:00:52 +0000 (17:00 -0200)
committerRajiv Andrade <srajiv@linux.vnet.ibm.com>
Wed, 16 Nov 2011 11:57:11 +0000 (09:57 -0200)
It's incorrect to assume that buffers returned by the TPM
10 bytes long are always error reports. This patches
parses the error field in its header instead. The error report
is now being printed using dev_err() instead of dev_dbg(), making
it easier for users to provide more detailed bug reports.

Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com>
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_tis.c

index efd24bbb5cb1ccc5bae48d6bca5f135b34ee0f8b..67335af0ec2afb5bbf296a1f5a7d400805f6a21d 100644 (file)
@@ -438,7 +438,6 @@ out:
 }
 
 #define TPM_DIGEST_SIZE 20
-#define TPM_ERROR_SIZE 10
 #define TPM_RET_CODE_IDX 6
 
 enum tpm_capabilities {
@@ -467,12 +466,14 @@ static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
        len = tpm_transmit(chip,(u8 *) cmd, len);
        if (len <  0)
                return len;
-       if (len == TPM_ERROR_SIZE) {
-               err = be32_to_cpu(cmd->header.out.return_code);
-               dev_dbg(chip->dev, "A TPM error (%d) occurred %s\n", err, desc);
-               return err;
-       }
-       return 0;
+       else if (len < TPM_HEADER_SIZE)
+               return -EFAULT;
+
+       err = be32_to_cpu(cmd->header.out.return_code);
+       if (err != 0)
+               dev_err(chip->dev, "A TPM error (%d) occurred %s\n", err, desc);
+
+       return err;
 }
 
 #define TPM_INTERNAL_RESULT_SIZE 200
index 9deb65c0ab615ad873764a87199c7d39423dd713..8c1df302fbb6ce17cd9580cca1aaeca84f785745 100644 (file)
@@ -39,7 +39,7 @@ enum tpm_addr {
 };
 
 #define TPM_WARN_DOING_SELFTEST 0x802
-
+#define TPM_HEADER_SIZE                10
 extern ssize_t tpm_show_pubek(struct device *, struct device_attribute *attr,
                                char *);
 extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
index 92f9f34e88f70ecf5508b0ceead3849277935195..10cc44ceb5d1259dc1c91a90168702f5a048ad9b 100644 (file)
@@ -29,8 +29,6 @@
 #include <linux/freezer.h>
 #include "tpm.h"
 
-#define TPM_HEADER_SIZE 10
-
 enum tis_access {
        TPM_ACCESS_VALID = 0x80,
        TPM_ACCESS_ACTIVE_LOCALITY = 0x20,