From 5ce8325f4ac4662d0daef63878c85462a8e59ff4 Mon Sep 17 00:00:00 2001 From: "Nam T. Nguyen" Date: Thu, 30 Oct 2014 15:09:43 -0700 Subject: vboot: cgpt: Check for NULL entry array. When GptLoad() fails to validate a header, it will not load the corresponding entry array, and hence will not allocate memory. The "*_entries" pointer then stay NULL. This CL checks for NULL pointer in CheckEntries() in the same way that CheckHeader() does. BUG=none BRANCH=none TEST=unittest Change-Id: I9f72e843590fbcbcf90d55640f86c782446e8755 Reviewed-on: https://chromium-review.googlesource.com/226778 Reviewed-by: Bill Richardson Commit-Queue: Nam Nguyen Tested-by: Nam Nguyen --- firmware/lib/cgptlib/cgptlib_internal.c | 2 ++ tests/cgptlib_test.c | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/firmware/lib/cgptlib/cgptlib_internal.c b/firmware/lib/cgptlib/cgptlib_internal.c index 9fdf9e28..4eea03df 100644 --- a/firmware/lib/cgptlib/cgptlib_internal.c +++ b/firmware/lib/cgptlib/cgptlib_internal.c @@ -131,6 +131,8 @@ int IsKernelEntry(const GptEntry *e) int CheckEntries(GptEntry *entries, GptHeader *h) { + if (!entries) + return GPT_ERROR_INVALID_ENTRIES; GptEntry *entry; uint32_t crc32; uint32_t i; diff --git a/tests/cgptlib_test.c b/tests/cgptlib_test.c index 21334a57..363ecc8a 100644 --- a/tests/cgptlib_test.c +++ b/tests/cgptlib_test.c @@ -1146,6 +1146,30 @@ static int SanityCheckTest(void) EXPECT(MASK_BOTH == gpt->valid_entries); EXPECT((GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2) == gpt->modified); + /* Test unloaded entry array. */ + gpt = GetEmptyGptData(); + BuildTestGptData(gpt); + gpt->primary_entries = NULL; + EXPECT(GPT_SUCCESS == GptSanityCheck(gpt)); + EXPECT(MASK_SECONDARY == gpt->valid_entries); + gpt = GetEmptyGptData(); + BuildTestGptData(gpt); + gpt->secondary_entries = NULL; + EXPECT(GPT_SUCCESS == GptSanityCheck(gpt)); + EXPECT(MASK_PRIMARY == gpt->valid_entries); + + /* Test unloaded header. */ + gpt = GetEmptyGptData(); + BuildTestGptData(gpt); + gpt->primary_header = NULL; + EXPECT(GPT_SUCCESS == GptSanityCheck(gpt)); + EXPECT(MASK_SECONDARY == gpt->valid_headers); + gpt = GetEmptyGptData(); + BuildTestGptData(gpt); + gpt->secondary_header = NULL; + EXPECT(GPT_SUCCESS == GptSanityCheck(gpt)); + EXPECT(MASK_PRIMARY == gpt->valid_headers); + return TEST_OK; } -- cgit v1.2.1