Blame SOURCES/0001-tpm2-When-writing-state-initialize-s_ContextSlotMask.patch

d6ed27
From b662e6fd7169f31ef664ecd0b0b45547462e1e31 Mon Sep 17 00:00:00 2001
d6ed27
From: Stefan Berger <stefanb@linux.ibm.com>
d6ed27
Date: Tue, 4 Jan 2022 14:45:31 -0500
d6ed27
Subject: [PATCH] tpm2: When writing state initialize s_ContextSlotMask if not
d6ed27
 set
d6ed27
d6ed27
If s_ContextSlotMask was not set since the TPM 2 was not initialized
d6ed27
by a call to TPM_Manufacture() or the state was not resumed, then
d6ed27
initialize the s_ContextSlotMask to 0xffff.
d6ed27
d6ed27
This situation can occur if a VM with an attached swtpm was started
d6ed27
and the VM's firmware either doesn't support TPM or didn't get to
d6ed27
initialize the vTPM.
d6ed27
d6ed27
The following commands recreated the issue with a SeaBIOS-only VM that
d6ed27
had no attached hard disk but an attached TPM 2:
d6ed27
d6ed27
virsh start BIOS-only-VM ; virsh save BIOS-only-VM save.bin ; \
d6ed27
 virsh restore save.bin
d6ed27
d6ed27
Error: Failed to restore domain from save.bin
d6ed27
error: internal error: qemu unexpectedly closed the monitor: \
d6ed27
2022-01-04T19:26:18.835851Z qemu-system-x86_64: tpm-emulator: Setting the stateblob (type 2) failed with a TPM error 0x3 a parameter is bad
d6ed27
2022-01-04T19:26:18.835899Z qemu-system-x86_64: error while loading state for instance 0x0 of device 'tpm-emulator'
d6ed27
2022-01-04T19:26:18.835929Z qemu-system-x86_64: load of migration failed: Input/output error
d6ed27
d6ed27
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2035731
d6ed27
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
d6ed27
---
d6ed27
 src/tpm2/NVMarshal.c | 5 +++++
d6ed27
 1 file changed, 5 insertions(+)
d6ed27
d6ed27
diff --git a/src/tpm2/NVMarshal.c b/src/tpm2/NVMarshal.c
d6ed27
index 996c73c..c7cd1e0 100644
d6ed27
--- a/src/tpm2/NVMarshal.c
d6ed27
+++ b/src/tpm2/NVMarshal.c
d6ed27
@@ -1422,6 +1422,11 @@ STATE_RESET_DATA_Marshal(STATE_RESET_DATA *data, BYTE **buffer, INT32 *size)
d6ed27
     written += UINT16_Marshal(&array_size, buffer, size);
d6ed27
     for (i = 0; i < array_size; i++)
d6ed27
         written += UINT16_Marshal(&data->contextArray[i], buffer, size);
d6ed27
+
d6ed27
+    if (s_ContextSlotMask != 0x00ff && s_ContextSlotMask != 0xffff) {
d6ed27
+        /* TPM wasn't initialized, so s_ContextSlotMask wasn't set */
d6ed27
+        s_ContextSlotMask = 0xffff;
d6ed27
+    }
d6ed27
     written += UINT16_Marshal(&s_ContextSlotMask, buffer, size);
d6ed27
 
d6ed27
     written += UINT64_Marshal(&data->contextCounter, buffer, size);
d6ed27
-- 
d6ed27
2.36.1
d6ed27