summaryrefslogtreecommitdiff
path: root/tpm.c
diff options
context:
space:
mode:
Diffstat (limited to 'tpm.c')
-rw-r--r--tpm.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/tpm.c b/tpm.c
index 808e0444..41f36651 100644
--- a/tpm.c
+++ b/tpm.c
@@ -10,6 +10,7 @@ typedef struct {
UINTN measuredcount = 0;
VARIABLE_RECORD *measureddata = NULL;
+static BOOLEAN tpm_defective = FALSE;
static BOOLEAN tpm_present(efi_tpm_protocol_t *tpm)
{
@@ -18,6 +19,9 @@ static BOOLEAN tpm_present(efi_tpm_protocol_t *tpm)
UINT32 flags;
EFI_PHYSICAL_ADDRESS eventlog, lastevent;
+ if (tpm_defective)
+ return FALSE;
+
caps.Size = (UINT8)sizeof(caps);
efi_status = tpm->status_check(tpm, &caps, &flags,
&eventlog, &lastevent);
@@ -192,6 +196,12 @@ static EFI_STATUS tpm_log_event_raw(EFI_PHYSICAL_ADDRESS buf, UINTN size,
(UINT64)size, TPM_ALG_SHA, event, &eventnum,
&lastevent);
}
+ if (efi_status == EFI_UNSUPPORTED) {
+ perror(L"Could not write TPM event: %r. Considering "
+ "the TPM as defective.\n", efi_status);
+ tpm_defective = TRUE;
+ efi_status = EFI_SUCCESS;
+ }
FreePool(event);
return efi_status;
}
@@ -353,3 +363,25 @@ fallback_should_prefer_reset(void)
return EFI_NOT_FOUND;
return EFI_SUCCESS;
}
+
+#ifdef SHIM_UNIT_TEST
+static void DESTRUCTOR
+tpm_clean_up_measurements(void)
+{
+ for (UINTN i = 0; i < measuredcount; i++) {
+ VARIABLE_RECORD *vr = &measureddata[i];
+
+ if (vr->VariableName)
+ FreePool(vr->VariableName);
+ if (vr->VendorGuid)
+ FreePool(vr->VendorGuid);
+ if (vr->Data)
+ FreePool(vr->Data);
+ }
+ if (measureddata)
+ FreePool(measureddata);
+
+ measuredcount = 0;
+ measureddata = NULL;
+}
+#endif