Skip to content

Commit

Permalink
tpm: tpm_crb: Add the missed acpi_put_table() to fix memory leak
Browse files Browse the repository at this point in the history
In crb_acpi_add(), we get the TPM2 table to retrieve information
like start method, and then assign them to the priv data, so the
TPM2 table is not used after the init, should be freed, call
acpi_put_table() to fix the memory leak.

Fixes: 30fc8d1 ("tpm: TPM 2.0 CRB Interface")
Cc: [email protected]
Signed-off-by: Hanjun Guo <[email protected]>
Reviewed-by: Jarkko Sakkinen <[email protected]>
Signed-off-by: Jarkko Sakkinen <[email protected]>
  • Loading branch information
guohanjun authored and jarkkojs committed Dec 8, 2022
1 parent 8740a12 commit 37e90c3
Showing 1 changed file with 20 additions and 9 deletions.
29 changes: 20 additions & 9 deletions drivers/char/tpm/tpm_crb.c
Original file line number Diff line number Diff line change
Expand Up @@ -676,20 +676,25 @@ static int crb_acpi_add(struct acpi_device *device)

/* Should the FIFO driver handle this? */
sm = buf->start_method;
if (sm == ACPI_TPM2_MEMORY_MAPPED)
return -ENODEV;
if (sm == ACPI_TPM2_MEMORY_MAPPED) {
rc = -ENODEV;
goto out;
}

priv = devm_kzalloc(dev, sizeof(struct crb_priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
if (!priv) {
rc = -ENOMEM;
goto out;
}

if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) {
if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) {
dev_err(dev,
FW_BUG "TPM2 ACPI table has wrong size %u for start method type %d\n",
buf->header.length,
ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC);
return -EINVAL;
rc = -EINVAL;
goto out;
}
crb_smc = ACPI_ADD_PTR(struct tpm2_crb_smc, buf, sizeof(*buf));
priv->smc_func_id = crb_smc->smc_func_id;
Expand All @@ -700,17 +705,23 @@ static int crb_acpi_add(struct acpi_device *device)

rc = crb_map_io(device, priv, buf);
if (rc)
return rc;
goto out;

chip = tpmm_chip_alloc(dev, &tpm_crb);
if (IS_ERR(chip))
return PTR_ERR(chip);
if (IS_ERR(chip)) {
rc = PTR_ERR(chip);
goto out;
}

dev_set_drvdata(&chip->dev, priv);
chip->acpi_dev_handle = device->handle;
chip->flags = TPM_CHIP_FLAG_TPM2;

return tpm_chip_register(chip);
rc = tpm_chip_register(chip);

out:
acpi_put_table((struct acpi_table_header *)buf);
return rc;
}

static int crb_acpi_remove(struct acpi_device *device)
Expand Down

0 comments on commit 37e90c3

Please sign in to comment.