On Thu, Mar 06, 2025 at 08:46:52PM +0100, Yann Diorcet wrote:
> When tpm2_submit_command_real is called for a retry, the content of
> out buffer can already be set with previous grub_tcg2_submit_command
> call's reply. Restore previous offset allowing the next
> tpm2_submit_command_real calls to succeed.
> 
> This solves the issues occurring during TPM_CC_Load command on the integrated
> TPM 2.0 in Intel Elkhart Lake chip.
> 
Thanks for catching this issue!

> Signed-off-by: Diorcet Yann <diorcet.y...@gmail.com>
> ---
>  grub-core/lib/tss2/tpm2_cmd.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/grub-core/lib/tss2/tpm2_cmd.c b/grub-core/lib/tss2/tpm2_cmd.c
> index 6d25db1ab..6be6c8fc5 100644
> --- a/grub-core/lib/tss2/tpm2_cmd.c
> +++ b/grub-core/lib/tss2/tpm2_cmd.c
> @@ -85,6 +85,7 @@ tpm2_submit_command (const TPMI_ST_COMMAND_TAG_t tag,
>                      struct grub_tpm2_buffer *out)
>  {
>    TPM_RC_t err;
> +  grub_size_t offset = out->offset;
>    int retry_cnt = 0;
> 
>    /* Catch TPM_RC_RETRY and send the command again */
Since we always need a clean output buffer, maybe we can call
'grub_tpm2_buffer_init(out)' right before 'tpm2_submit_command_real()'
to make sure the output buffer is always initialized. Besides, with this
change, we can remove all 'grub_tpm2_buffer_init (&out)' in the TPM2
command functions.

Gary Lin

> @@ -93,6 +94,9 @@ tpm2_submit_command (const TPMI_ST_COMMAND_TAG_t tag,
>      if (*responseCode != TPM_RC_RETRY)
>        break;
> 
> +    /* May be already filled with previous tpm2_submit_command_real call:
> +       restore initial offset */
> +    out->offset = offset;
>      retry_cnt++;
>    } while (retry_cnt < 3);
> 
> --
> 2.39.5
> 
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> https://lists.gnu.org/mailman/listinfo/grub-devel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to