summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2019-04-01 20:43:45 +0800
committerchrome-bot <chrome-bot@chromium.org>2019-04-13 01:32:21 -0700
commit6ed4c9938ff0026bb2837171242cd39141e34055 (patch)
tree1d63ac0a7952b48ef764c2bd30b4f8d627b129c4
parent79a76d201579fb1b6b48931de1eabe2f968c1070 (diff)
downloadvboot-6ed4c9938ff0026bb2837171242cd39141e34055.tar.gz
vboot: fix vboot_api_kernel_tests after ctx change
CL:1517061 pulled vb2_context storage up to a higher level in the call stack. It also changed vboot_api_kernel{4,5}_tests to use the same context object as that used for VbExNvStorageRead and VbExNvStorageWrite calls. These tests were already initializing the vb2_context workbuf. Since VbSelectAndLoadKernel and VbVerifyMemoryBootImage both initialize the context object internally, ctx.workbuf was being overwritten as part of the call, causing issues later on when calling free(). (See chromium:946970 for more details.) Separate these two context objects to clarify which one is being used as an NVRAM backend, and which one is the classical "context" object passed around in vboot flow. Also remove the NVRAM context's workbuf, since it is not used. BUG=b:124141368, chromium:946970 TEST=make clean && make runtests BRANCH=none Change-Id: Ic1da92ce754e61d4102ca8a6eb9587cd8d9eca10 Signed-off-by: Joel Kitching <kitching@google.com> Reviewed-on: https://chromium-review.googlesource.com/1547711 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Joel Kitching <kitching@chromium.org> Reviewed-by: Joel Kitching <kitching@chromium.org>
-rw-r--r--tests/vboot_api_kernel4_tests.c52
-rw-r--r--tests/vboot_api_kernel5_tests.c24
2 files changed, 43 insertions, 33 deletions
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index fb27add8..ab9d557f 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -25,9 +25,8 @@
#include "vboot_struct.h"
/* Mock data */
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
static struct vb2_context ctx;
-static struct vb2_shared_data *sd;
+static struct vb2_context ctx_nvram_backend;
static VbCommonParams cparams;
static VbSelectAndLoadKernelParams kparams;
static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
@@ -60,15 +59,20 @@ static void ResetMocks(void)
gbb.minor_version = GBB_MINOR_VER;
gbb.flags = 0;
+ /* ctx.workbuf will be allocated and initialized by
+ * VbSelectAndLoadKernel. */
memset(&ctx, 0, sizeof(ctx));
- ctx.workbuf = workbuf;
- ctx.workbuf_size = sizeof(workbuf);
- vb2_init_context(&ctx);
- vb2_nv_init(&ctx);
- vb2_nv_set(&ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0xffffffff);
- sd = vb2_get_sd(&ctx);
- sd->vbsd = shared;
+ /*
+ * ctx_nvram_backend is only used as an NVRAM backend (see
+ * VbExNvStorageRead and VbExNvStorageWrite), and with
+ * vb2_set_nvdata and nv2_get_nvdata to manually read and tweak
+ * contents. No other initialization is needed.
+ */
+ memset(&ctx_nvram_backend, 0, sizeof(ctx_nvram_backend));
+ vb2_nv_init(&ctx_nvram_backend);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_KERNEL_MAX_ROLLFORWARD,
+ 0xffffffff);
memset(&shared_data, 0, sizeof(shared_data));
VbSharedDataInit(shared, sizeof(shared_data));
@@ -89,13 +93,15 @@ static void ResetMocks(void)
VbError_t VbExNvStorageRead(uint8_t *buf)
{
- memcpy(buf, ctx.nvdata, vb2_nv_get_size(&ctx));
+ memcpy(buf, ctx_nvram_backend.nvdata,
+ vb2_nv_get_size(&ctx_nvram_backend));
return VBERROR_SUCCESS;
}
VbError_t VbExNvStorageWrite(const uint8_t *buf)
{
- memcpy(ctx.nvdata, buf, vb2_nv_get_size(&ctx));
+ memcpy(ctx_nvram_backend.nvdata, buf,
+ vb2_nv_get_size(&ctx_nvram_backend));
return VBERROR_SUCCESS;
}
@@ -163,7 +169,7 @@ VbError_t VbBootDiagnostic(struct vb2_context *ctx)
static void test_slk(VbError_t retval, int recovery_reason, const char *desc)
{
TEST_EQ(VbSelectAndLoadKernel(&ctx, &cparams, &kparams), retval, desc);
- TEST_EQ(vb2_nv_get(&ctx, VB2_NV_RECOVERY_REQUEST),
+ TEST_EQ(vb2_nv_get(&ctx_nvram_backend, VB2_NV_RECOVERY_REQUEST),
recovery_reason, " recovery reason");
}
@@ -222,20 +228,20 @@ static void VbSlkTest(void)
TEST_EQ(rkr_version, 0x10002, " version");
ResetMocks();
- vb2_nv_set(&ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x30005);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x30005);
new_version = 0x40006;
test_slk(0, 0, "Limit max roll forward");
TEST_EQ(rkr_version, 0x30005, " version");
ResetMocks();
- vb2_nv_set(&ctx, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x10001);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_KERNEL_MAX_ROLLFORWARD, 0x10001);
new_version = 0x40006;
test_slk(0, 0, "Max roll forward can't rollback");
TEST_EQ(rkr_version, 0x10002, " version");
ResetMocks();
vbboot_retval = VBERROR_INVALID_KERNEL_FOUND;
- vb2_nv_set(&ctx, VB2_NV_RECOVERY_REQUEST, 123);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_RECOVERY_REQUEST, 123);
shared->flags |= VBSD_FWB_TRIED;
shared->firmware_index = 1;
test_slk(VBERROR_INVALID_KERNEL_FOUND,
@@ -261,26 +267,26 @@ static void VbSlkTest(void)
if (DIAGNOSTIC_UI) {
ResetMocks();
mock_switches[1] = VB_SWITCH_FLAG_PHYS_PRESENCE_PRESSED;
- vb2_nv_set(&ctx, VB2_NV_DIAG_REQUEST, 1);
- vb2_nv_set(&ctx, VB2_NV_OPROM_NEEDED, 1);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_DIAG_REQUEST, 1);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_OPROM_NEEDED, 1);
vbboot_retval = -4;
test_slk(VBERROR_SIMULATED, 0, "Normal boot with diag");
- TEST_EQ(vb2_nv_get(&ctx, VB2_NV_DIAG_REQUEST), 0,
+ TEST_EQ(vb2_nv_get(&ctx_nvram_backend, VB2_NV_DIAG_REQUEST), 0,
" diag not requested");
- TEST_EQ(vb2_nv_get(&ctx, VB2_NV_OPROM_NEEDED), 1,
+ TEST_EQ(vb2_nv_get(&ctx_nvram_backend, VB2_NV_OPROM_NEEDED), 1,
" oprom still needed");
ResetMocks();
mock_switches[1] = VB_SWITCH_FLAG_PHYS_PRESENCE_PRESSED;
- vb2_nv_set(&ctx, VB2_NV_DIAG_REQUEST, 1);
- vb2_nv_set(&ctx, VB2_NV_OPROM_NEEDED, 1);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_DIAG_REQUEST, 1);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_OPROM_NEEDED, 1);
shared->flags |= VBSD_OPROM_MATTERS;
vbboot_retval = -4;
test_slk(VBERROR_SIMULATED, 0,
"Normal boot with diag and oprom");
- TEST_EQ(vb2_nv_get(&ctx, VB2_NV_DIAG_REQUEST), 0,
+ TEST_EQ(vb2_nv_get(&ctx_nvram_backend, VB2_NV_DIAG_REQUEST), 0,
" diag not requested");
- TEST_EQ(vb2_nv_get(&ctx, VB2_NV_OPROM_NEEDED), 0,
+ TEST_EQ(vb2_nv_get(&ctx_nvram_backend, VB2_NV_OPROM_NEEDED), 0,
" oprom not needed");
}
diff --git a/tests/vboot_api_kernel5_tests.c b/tests/vboot_api_kernel5_tests.c
index d836349e..65899aec 100644
--- a/tests/vboot_api_kernel5_tests.c
+++ b/tests/vboot_api_kernel5_tests.c
@@ -27,9 +27,8 @@
#include "vboot_struct.h"
/* Mock data */
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE];
static struct vb2_context ctx;
-static struct vb2_shared_data *sd;
+static struct vb2_context ctx_nvram_backend;
static VbCommonParams cparams;
static VbSelectAndLoadKernelParams kparams;
static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
@@ -68,14 +67,18 @@ static void ResetMocks(void)
gbb->rootkey_offset = sizeof(*gbb);
gbb->rootkey_size = sizeof(VbPublicKey);
+ /* ctx.workbuf will be allocated and initialized by
+ * VbVerifyMemoryBootImage. */
memset(&ctx, 0, sizeof(ctx));
- ctx.workbuf = workbuf;
- ctx.workbuf_size = sizeof(workbuf);
- vb2_init_context(&ctx);
- vb2_nv_init(&ctx);
- sd = vb2_get_sd(&ctx);
- sd->vbsd = shared;
+ /*
+ * ctx_nvram_backend is only used as an NVRAM backend (see
+ * VbExNvStorageRead and VbExNvStorageWrite), and with
+ * vb2_set_nvdata and nv2_get_nvdata to manually read and tweak
+ * contents. No other initialization is needed.
+ */
+ memset(&ctx_nvram_backend, 0, sizeof(ctx_nvram_backend));
+ vb2_nv_init(&ctx_nvram_backend);
memset(&shared_data, 0, sizeof(shared_data));
VbSharedDataInit(shared, sizeof(shared_data));
@@ -174,7 +177,8 @@ int vb2_verify_data(const uint8_t *data,
VbError_t VbExNvStorageRead(uint8_t *buf)
{
- memcpy(buf, ctx.nvdata, vb2_nv_get_size(&ctx));
+ memcpy(buf, ctx_nvram_backend.nvdata,
+ vb2_nv_get_size(&ctx_nvram_backend));
return VBERROR_SUCCESS;
}
@@ -238,7 +242,7 @@ static void VerifyMemoryBootImageTest(void)
ResetMocks();
shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
key_block_verify_fail = 1;
- vb2_nv_set(&ctx, VB2_NV_DEV_BOOT_FASTBOOT_FULL_CAP, 1);
+ vb2_nv_set(&ctx_nvram_backend, VB2_NV_DEV_BOOT_FASTBOOT_FULL_CAP, 1);
TEST_EQ(VbVerifyMemoryBootImage(&ctx, &cparams, &kparams, kernel_buffer,
kernel_buffer_size),
VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");