Re: [PATCH v5 1/2] acpi: Extend TPM2 ACPI table with missing log fields
From: Jarkko Sakkinen <hidden>
Date: 2020-06-25 02:34:40
Also in:
linux-acpi, linux-security-module, lkml
On Wed, Jun 24, 2020 at 08:38:25PM -0400, Stefan Berger wrote:
On 6/24/20 8:00 PM, Jarkko Sakkinen wrote:quoted
On Tue, Jun 23, 2020 at 08:06:35AM -0400, Stefan Berger wrote:quoted
From: Stefan Berger <stefanb@linux.ibm.com> Recent extensions of the TPM2 ACPI table added 3 more fields including 12 bytes of start method specific parameters and Log Area Minimum Length (u32) and Log Area Start Address (u64). So, we extend the existing structure with these fields to allow non-UEFI systems to access the TPM2's log. The specification that has the new fields is the following: TCG ACPI Specification Family "1.2" and "2.0" Version 1.2, Revision 8 Adapt all existing table size calculations to use offsetof(struct acpi_table_tpm2, start_method_specific) [where start_method_specific is a newly added field] rather than sizeof(struct acpi_table_tpm2) so that the addition of the new fields does not affect current systems that may not have them.I found at least one regression from this patch. Please remove my reviewed-by comment form the next version. Should have: Link: https://trustedcomputinggroup.org/wp-content/uploads/TCG_ACPIGeneralSpecification_v1.20_r8.pdf Please, add this.quoted
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> Cc: linux-acpi@vger.kernel.org Acked-by: Rafael J. Wysocki <redacted> Reviewed-by: Jarkko Sakkinen <redacted> --- drivers/char/tpm/tpm_crb.c | 13 ++++++++++--- drivers/char/tpm/tpm_tis.c | 4 +++- include/acpi/actbl3.h | 5 +++-- 3 files changed, 16 insertions(+), 6 deletions(-)diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index a9dcf31eadd2..0565aa5482f9 100644 --- a/drivers/char/tpm/tpm_crb.c +++ b/drivers/char/tpm/tpm_crb.c@@ -669,7 +669,9 @@ static int crb_acpi_add(struct acpi_device *device) status = acpi_get_table(ACPI_SIG_TPM2, 1, (struct acpi_table_header **) &buf); - if (ACPI_FAILURE(status) || buf->header.length < sizeof(*buf)) { + if (ACPI_FAILURE(status) || buf->header.length < + offsetof(struct acpi_table_tpm2, + start_method_specific)) { dev_err(dev, FW_BUG "failed to get TPM2 ACPI table\n"); return -EINVAL; }@@ -684,14 +686,19 @@ static int crb_acpi_add(struct acpi_device *device) return -ENOMEM; if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) { - if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) { + if (buf->header.length < + (offsetof(struct acpi_table_tpm2, + start_method_specific) +Should be offsetof(struct acpti_table_tpm2, log_area_minimum_length)The old code had sizeof(*buf) with buf being 'struct acpi_table_tpm2' and that was equivalent to offsetof(struct acpi_table_tpm2, start_method_specific) since 'start_method_specific' is the first new field that we are adding right here. Also see 3rd paragraph in the patch description. The replacement rule described there should apply to all sizeof() calculations on 'struct acpi_table_tpm2.'
Aren't you ignoring sizeof(*crb_smc) then?
I'll address the other issues. Stefan