diff options
author | Nam T. Nguyen <namnguyen@chromium.org> | 2014-10-30 15:09:43 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-10-31 20:55:31 +0000 |
commit | 5ce8325f4ac4662d0daef63878c85462a8e59ff4 (patch) | |
tree | fa11c0a60e8e754be8da762c2ccff03400419b9f | |
parent | f4f395e1ca724ef8795cfe86a9edbf15f14eacd1 (diff) | |
download | vboot-5ce8325f4ac4662d0daef63878c85462a8e59ff4.tar.gz |
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 <wfrichar@chromium.org>
Commit-Queue: Nam Nguyen <namnguyen@chromium.org>
Tested-by: Nam Nguyen <namnguyen@chromium.org>
-rw-r--r-- | firmware/lib/cgptlib/cgptlib_internal.c | 2 | ||||
-rw-r--r-- | tests/cgptlib_test.c | 24 |
2 files changed, 26 insertions, 0 deletions
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; } |