You've already forked slimbootloader
mirror of
https://github.com/Dasharo/slimbootloader.git
synced 2026-03-06 15:26:20 -08:00
Addressed coverity issues - Untrusted loop bound (CWE 606) - Uninitialized pointer read (CWE 457) Defined Elf file max section, program numbers and size Signed-off-by: Kevin Tsai <kevin.tsai@intel.com>
147 lines
4.2 KiB
C
147 lines
4.2 KiB
C
/** @file
|
|
ELF library
|
|
|
|
Copyright (c) 2018 - 2023, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef __ELF_LIB_H__
|
|
#define __ELF_LIB_H__
|
|
|
|
#include <PiPei.h>
|
|
#include <IndustryStandard/PeImage.h>
|
|
|
|
#define ELF_CLASS32 1
|
|
#define ELF_CLASS64 2
|
|
|
|
#define ELF_PT_LOAD 1
|
|
|
|
/*
|
|
* Define Max value for Coverity check
|
|
*/
|
|
#define MAX_ELF_SHNUM 100
|
|
#define MAX_ELF_PHNUM 50
|
|
#define NAX_ELF_RELOC_SECT_SIZE 0x10000
|
|
|
|
typedef struct {
|
|
RETURN_STATUS ParseStatus; ///< Return the status after ParseElfImage().
|
|
UINT8 *FileBase; ///< The source location in memory.
|
|
UINTN FileSize; ///< The size including sections that don't require loading.
|
|
UINT8 *PreferredImageAddress; ///< The preferred image to be loaded. No relocation is needed if loaded to this address.
|
|
BOOLEAN ReloadRequired; ///< The image needs a new memory location for running.
|
|
UINT8 *ImageAddress; ///< The destination memory address set by caller.
|
|
UINTN ImageSize; ///< The memory size for loading and execution.
|
|
UINT32 EiClass;
|
|
UINT32 ShNum;
|
|
UINT32 PhNum;
|
|
UINTN ShStrOff;
|
|
UINTN ShStrLen;
|
|
UINTN EntryPoint; ///< Return the actual entry point after LoadElfImage().
|
|
} ELF_IMAGE_CONTEXT;
|
|
|
|
|
|
typedef struct {
|
|
UINT32 PtType;
|
|
UINTN Offset;
|
|
UINTN Length;
|
|
UINTN MemLen;
|
|
UINTN MemAddr;
|
|
UINTN Alignment;
|
|
} SEGMENT_INFO;
|
|
|
|
|
|
/**
|
|
Check if the ELF image is valid.
|
|
|
|
@param[in] ImageBase Memory address of an image.
|
|
|
|
@retval TRUE if valid.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsElfFormat (
|
|
IN CONST UINT8 *ImageBase
|
|
);
|
|
|
|
/**
|
|
Parse the ELF image info.
|
|
|
|
@param[in] ImageBase Memory address of an image.
|
|
@param[out] ElfCt The EFL image context pointer.
|
|
|
|
@retval EFI_INVALID_PARAMETER Input parameters are not valid.
|
|
@retval EFI_UNSUPPORTED Unsupported binary type.
|
|
@retval EFI_LOAD_ERROR ELF binary loading error.
|
|
@retval EFI_SUCCESS ELF binary is loaded successfully.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
ParseElfImage (
|
|
IN VOID *ImageBase,
|
|
OUT ELF_IMAGE_CONTEXT *ElfCt
|
|
);
|
|
|
|
/**
|
|
Load the ELF segments to specified address in ELF header.
|
|
|
|
This function loads ELF image segments into memory address specified
|
|
in ELF program header.
|
|
|
|
@param[in] ElfCt ELF image context pointer.
|
|
|
|
@retval EFI_INVALID_PARAMETER Input parameters are not valid.
|
|
@retval EFI_UNSUPPORTED Unsupported binary type.
|
|
@retval EFI_LOAD_ERROR ELF binary loading error.
|
|
@retval EFI_SUCCESS ELF binary is loaded successfully.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
LoadElfImage (
|
|
IN ELF_IMAGE_CONTEXT *ElfCt
|
|
);
|
|
|
|
/**
|
|
Get a ELF section name from its index.
|
|
|
|
@param[in] ElfCt ELF image context pointer.
|
|
@param[in] SectionIndex ELF section index.
|
|
@param[out] SectionName The pointer to the section name.
|
|
|
|
@retval EFI_INVALID_PARAMETER ElfCt or SecName is NULL.
|
|
@retval EFI_NOT_FOUND Could not find the section.
|
|
@retval EFI_SUCCESS Section name was filled successfully.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
GetElfSectionName (
|
|
IN ELF_IMAGE_CONTEXT *ElfCt,
|
|
IN UINT32 SectionIndex,
|
|
OUT CHAR8 **SectionName
|
|
);
|
|
|
|
/**
|
|
Get the offset and size of x-th ELF section.
|
|
|
|
@param[in] ElfCt ELF image context pointer.
|
|
@param[in] Index ELF section index.
|
|
@param[out] Offset Return the offset of the specific section.
|
|
@param[out] Size Return the size of the specific section.
|
|
|
|
@retval EFI_INVALID_PARAMETER ImageBase, Offset or Size is NULL.
|
|
@retval EFI_INVALID_PARAMETER EiClass doesn't equal to ELFCLASS32 or ELFCLASS64.
|
|
@retval EFI_NOT_FOUND Could not find the section.
|
|
@retval EFI_SUCCESS Offset and Size are returned.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
GetElfSectionPos (
|
|
IN ELF_IMAGE_CONTEXT *ElfCt,
|
|
IN UINT32 Index,
|
|
OUT UINTN *Offset,
|
|
OUT UINTN *Size
|
|
);
|
|
|
|
#endif /* __ELF_LIB_H__ */
|