summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Compostella <jeremy.compostella@intel.com>2023-10-24 10:09:54 -0700
committerMatt DeVillier <matt.devillier@amd.corp-partner.google.com>2023-11-02 13:29:04 +0000
commiteb93808fa53d95900ea42b42f8c943c282d99973 (patch)
treeeaeb515e40c02e767b20227f214d0f8555c074c5
parent47b393a17d8c911601a5044bb41de3eb3215f458 (diff)
commonlib/fsp_relocate: Fix potential NULL pointer dereference
Commit 1df1cf994aa9 ("commonlib/fsp_relocate: add PE32 section support") introduced a potential NULL pointer dereference if there is PE32 binary to relocate outside of the first firmware volume. The `fih_offset' pointer was used as an output variable but now it is also used as an input variable to pass the FSP information header to the `pe_relocate()' function. This commit resolves this potential NULL-pointer dereference by passing the pointer systematically and without affecting the logic as it is only set if it has not been set before. Change-Id: I9fad90a60854d5f050aa044a5c0b3af91c99df4a Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/78501 Reviewed-by: Bora Guvendik <bora.guvendik@intel.com> Reviewed-by: Eric Lai <ericllai@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/commonlib/fsp_relocate.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/src/commonlib/fsp_relocate.c b/src/commonlib/fsp_relocate.c
index 379930b22b..96d31b3ea6 100644
--- a/src/commonlib/fsp_relocate.c
+++ b/src/commonlib/fsp_relocate.c
@@ -584,7 +584,7 @@ static ssize_t relocate_fvh(uintptr_t new_addr, void *fsp, size_t fsp_size,
printk(FSP_DBG_LVL, "file offset: %zx\n", file_offset);
/* First file and section should be FSP info header. */
- if (fih_offset != NULL && *fih_offset == 0)
+ if (*fih_offset == 0)
*fih_offset = file_offset;
ffsfh = relative_offset(fsp, file_offset);
@@ -671,14 +671,8 @@ ssize_t fsp_component_relocate(uintptr_t new_addr, void *fsp, size_t size)
while (offset < size) {
ssize_t nparsed;
- /* Relocate each FV within the FSP region. The FSP_INFO_HEADER
- * should only be located in the first FV. */
- if (offset == 0)
- nparsed = relocate_fvh(new_addr, fsp, size, offset,
- &fih_offset);
- else
- nparsed = relocate_fvh(new_addr, fsp, size, offset,
- NULL);
+ /* Relocate each FV within the FSP region. */
+ nparsed = relocate_fvh(new_addr, fsp, size, offset, &fih_offset);
/* FV should be larger than 0 or failed to parse. */
if (nparsed <= 0) {