summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@chromium.org>2013-03-02 21:00:03 -0800
committerChromeBot <chrome-bot@google.com>2013-03-04 14:30:23 -0800
commit522da3e2c9c016a4bc2124cde69a688e790c9dc5 (patch)
tree4d9fde43f508765427ae0ab3f01577dabcbcbf06
parent51d22d5f8d05b582423978894352e8f30fd164b6 (diff)
downloadvboot-522da3e2c9c016a4bc2124cde69a688e790c9dc5.tar.gz
Use Memcpy to avoid unaligned accesses when using RollbackKernelSpace.
This structure, like RollbackSpaceFirmware in my previous CL, contains members that are inherently unaligned. This breaks when the machine running vboot cares about alignment. Like before, I'm using Memcpy to avoid the direct unaligned accesses. BUG=chrome-os-partner:17340 TEST=Built and booted into depthcharge on Snow. Without this change, there's an unaligned access in RollbackKernelRead. After this change, the unaligned access goes away and vboot gets at the kernel version successfully. BRANCH=None Change-Id: Ifcdcee1ab4bbce74d05e563cb82bef73a1aa9a84 Signed-off-by: Gabe Black <gabeblack@google.com> Reviewed-on: https://gerrit.chromium.org/gerrit/44503 Reviewed-by: Randall Spangler <rspangler@chromium.org> Commit-Queue: Gabe Black <gabeblack@chromium.org> Tested-by: Gabe Black <gabeblack@chromium.org>
-rw-r--r--firmware/lib/rollback_index.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/firmware/lib/rollback_index.c b/firmware/lib/rollback_index.c
index 4047bc3b..11bc12d5 100644
--- a/firmware/lib/rollback_index.c
+++ b/firmware/lib/rollback_index.c
@@ -606,7 +606,7 @@ uint32_t RollbackFirmwareLock(void)
uint32_t RollbackKernelRead(uint32_t* version)
{
RollbackSpaceKernel rsk;
- uint32_t perms;
+ uint32_t perms, uid;
/*
* Read the kernel space and verify its permissions. If the kernel
@@ -618,21 +618,24 @@ uint32_t RollbackKernelRead(uint32_t* version)
*/
RETURN_ON_FAILURE(ReadSpaceKernel(&rsk));
RETURN_ON_FAILURE(TlclGetPermissions(KERNEL_NV_INDEX, &perms));
- if (TPM_NV_PER_PPWRITE != perms || ROLLBACK_SPACE_KERNEL_UID != rsk.uid)
+ Memcpy(&uid, &rsk.uid, sizeof(uid));
+ if (TPM_NV_PER_PPWRITE != perms || ROLLBACK_SPACE_KERNEL_UID != uid)
return TPM_E_CORRUPTED_STATE;
- *version = rsk.kernel_versions;
- VBDEBUG(("TPM: RollbackKernelRead %x\n", (int)rsk.kernel_versions));
+ Memcpy(version, &rsk.kernel_versions, sizeof(*version));
+ VBDEBUG(("TPM: RollbackKernelRead %x\n", (int)*version));
return TPM_SUCCESS;
}
uint32_t RollbackKernelWrite(uint32_t version)
{
RollbackSpaceKernel rsk;
+ uint32_t old_version;
RETURN_ON_FAILURE(ReadSpaceKernel(&rsk));
+ Memcpy(&old_version, &rsk.kernel_versions, sizeof(old_version));
VBDEBUG(("TPM: RollbackKernelWrite %x --> %x\n",
- (int)rsk.kernel_versions, (int)version));
- rsk.kernel_versions = version;
+ (int)old_version, (int)version));
+ Memcpy(&rsk.kernel_versions, &version, sizeof(version));
return WriteSpaceKernel(&rsk);
}