lkml.org 
[lkml]   [2012]   [Nov]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v2] char/tpm: simplify duration calculation and eliminate smatch warning.
On Fri, Nov 16, 2012 at 12:31:29AM +0100, Peter Huewe wrote:
> This patch changes the semantics of the duration calculation for an
> ordinal, by masking out the higher bits of a tpm command, which specify
> whether it's an TPM_PROTECTED_COMMAND, TPM_UNPROTECTED_COMMAND,
> TPM_CONNECTION_COMMAND, TPM_CONNECTION_COMMAND, TPM_VENDOR_COMMAND.
> (See TPM Main Spec Part 2 Section 17 for details).
>
> For all TPM_PROTECTED and TPM_CONNECTION commands the results are
> unchanged.
> The TPM_UNPROTECTED commands are TSS commands and thus irrelevant as
> they are not sent to the tpm.
> For vendor commands the semantics change for ordinals 10 and 11 but
> they were probably wrong anyway.
>
> For everything else which has the ordinal set to 10 or 11 the semantics
> change as it now uses TPM_UNDEFINED instead of TPM_SHORT which was
> probably wrong anyway (but irrelevant as not defined by the standard).
>
> This patch also gets rid of the (false positive) smatch warning:
> drivers/char/tpm/tpm.c:360 tpm_calc_ordinal_duration() error: buffer
> overflow 'tpm_protected_ordinal_duration' 12 <= 243
>
> Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
> ---
> v2: Smatch not sparse and TSC instead of TCS ;)

Applied. Thanks. I'm queuing these up at:

git://github.com/shpedoikal/linux.git tpmdd-11-14-12

Kent

>
> drivers/char/tpm/tpm.c | 13 ++++++-------
> 1 files changed, 6 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
> index 9e3c529..0a08af0 100644
> --- a/drivers/char/tpm/tpm.c
> +++ b/drivers/char/tpm/tpm.c
> @@ -40,8 +40,9 @@ enum tpm_duration {
> };
>
> #define TPM_MAX_ORDINAL 243
> -#define TPM_MAX_PROTECTED_ORDINAL 12
> -#define TPM_PROTECTED_ORDINAL_MASK 0xFF
> +#define TSC_MAX_ORDINAL 12
> +#define TPM_PROTECTED_COMMAND 0x00
> +#define TPM_CONNECTION_COMMAND 0x40
>
> /*
> * Bug workaround - some TPM's don't flush the most
> @@ -336,13 +337,11 @@ unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
> {
> int duration_idx = TPM_UNDEFINED;
> int duration = 0;
> + u8 category = (ordinal >> 24) & 0xFF;
>
> - if (ordinal < TPM_MAX_ORDINAL)
> + if ((category == TPM_PROTECTED_COMMAND && ordinal < TPM_MAX_ORDINAL) ||
> + (category == TPM_CONNECTION_COMMAND && ordinal < TSC_MAX_ORDINAL))
> duration_idx = tpm_ordinal_duration[ordinal];
> - else if ((ordinal & TPM_PROTECTED_ORDINAL_MASK) <
> - TPM_MAX_PROTECTED_ORDINAL)
> - duration_idx =
> - tpm_ordinal_duration[ordinal & TPM_PROTECTED_ORDINAL_MASK];
>
> if (duration_idx != TPM_UNDEFINED)
> duration = chip->vendor.duration[duration_idx];
> --
> 1.7.8.6
>



\
 
 \ /
  Last update: 2012-11-16 19:21    [W:0.149 / U:0.248 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site