Reviewed-by: Chasel Chiu <chasel.c...@intel.com>
> -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > Kubacki, Michael A > Sent: Saturday, August 24, 2019 7:24 AM > To: devel@edk2.groups.io > Cc: Chiu, Chasel <chasel.c...@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desim...@intel.com>; Gao, Liming <liming....@intel.com> > Subject: [edk2-devel] [edk2-platforms][PATCH V1 1/1] > MinPlatformPkg/MultiBoardInitSupportLib: Fix NULL pointer dereferences > > REF:https://bugzilla.tianocore.org/show_bug.cgi?id=2114 > > Removes potential NULL pointer de-references in the library and validates > NULL pointers are not passed to library functions. > > Cc: Chasel Chiu <chasel.c...@intel.com> > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > Cc: Liming Gao <liming....@intel.com> > Signed-off-by: Michael Kubacki <michael.a.kuba...@intel.com> > --- > Platform/Intel/MinPlatformPkg/Include/Library/MultiBoardInitSupportLib.h > | 84 ++++++++++++++++- > > Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportL > ib/DxeMultiBoardInitSupportLib.c | 24 ++++- > Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportL > ib/PeiMultiBoardInitSupportLib.c | 97 +++++++++++++++++--- > 3 files changed, 188 insertions(+), 17 deletions(-) > > diff --git > a/Platform/Intel/MinPlatformPkg/Include/Library/MultiBoardInitSupportLib. > h > b/Platform/Intel/MinPlatformPkg/Include/Library/MultiBoardInitSupportLib. > h > index 6c14b5677d..a854f61e27 100644 > --- > a/Platform/Intel/MinPlatformPkg/Include/Library/MultiBoardInitSupportLib. > h > +++ b/Platform/Intel/MinPlatformPkg/Include/Library/MultiBoardInitSuppor > +++ tLib.h > @@ -1,6 +1,6 @@ > /** @file > > -Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -10,18 +10,39 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > #include <Library/BoardInitLib.h> > > +/** > + This board service detects the board type. > + > + @retval EFI_SUCCESS The board was detected successfully. > + @retval EFI_NOT_FOUND The board could not be detected. > + > +**/ > typedef > EFI_STATUS > (EFIAPI *BOARD_DETECT) ( > VOID > ); > > +/** > + This board service performs board-specific initialization. > + > + @retval EFI_SUCCESS Board-specific initialization was successful. > + @retval EFI_NOT_READY The board has not been detected yet. > + > +**/ > typedef > EFI_STATUS > (EFIAPI *BOARD_INIT) ( > VOID > ); > > +/** > + This board service detects the boot mode. > + > + @retval EFI_BOOT_MODE The boot mode. > + @retval EFI_NOT_READY The board has not been detected yet. > + > +**/ > typedef > EFI_BOOT_MODE > (EFIAPI *BOARD_BOOT_MODE_DETECT) ( > @@ -52,24 +73,85 @@ typedef struct { > BOARD_INIT BoardInitEndOfFirmware; > } BOARD_NOTIFICATION_INIT_FUNC; > > +/** > + Registers the given function for callback during board detection. > + > + When this function is called the given function pointer is added to > + an internal list. When board detection is performed within the > + BoardDetect() API, the function pointers in the list will be invoked until a > board detection function reports it has successfully detected the board. > + > + @param[in] BoardDetect A pointer to a function of type > BOARD_DETECT_FUNC that is called during > + board detection. > + > + @retval EFI_SUCCESS The function was successfully > registered. > + @retval EFI_INVALID_PARAMETER The function pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to add a new board detection callback. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardDetect ( > IN BOARD_DETECT_FUNC *BoardDetect > ); > > +/** > + Registers the given set of board functions for callback to perform > pre-memory board initialization tasks. > + > + When this function is called, the given structure of function > + pointers are stored for future invocation. When board pre-memory > + initialization tasks are required, the corresponding pre-memory > + function in this structure will be called. Typically, > RegisterBoardPreMemInit() > is called during board detection with the successfully detected board > providing its set of board-specific pre-memory initialization functions. > + > + @param[in] BoardPreMemInit A pointer to a structure of function > pointers described in the type > + BOARD_PRE_MEM_INIT_FUNC. > + > + @retval EFI_SUCCESS The board pre-memory functions were > successfully registered. > + @retval EFI_INVALID_PARAMETER The pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to register the callback functions. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardPreMemInit ( > IN BOARD_PRE_MEM_INIT_FUNC *BoardPreMemInit > ); > > +/** > + Registers the given set of board functions for callback to perform > post-memory board initialization tasks. > + > + When this function is called, the given structure of function > + pointers are stored for future invocation. When board post-memory > + initialization tasks are required, the corresponding post-memory > + function in this structure will be called. Typically, > RegisterBoardPostMemInit() is called during board detection with the > successfuly detected board providing its set of board-specific post-memory > initialization functions. > + > + @param[in] BoardPostMemInit A pointer to a structure of function > pointers described in the type > + BOARD_POST_MEM_INIT_FUNC. > + > + @retval EFI_SUCCESS The board post-memory functions were > successfully registered. > + @retval EFI_INVALID_PARAMETER The pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to register the callback functions. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardPostMemInit ( > IN BOARD_POST_MEM_INIT_FUNC *BoardPostMemInit > ); > > +/** > + Registers the given set of board functions for callback to perform board > initialization tasks. > + > + When this function is called, the given structure of function > + pointers are stored for future invocation. When board initialization tasks > are required, the corresponding functions in this structure will be called. > + > + @param[in] BoardNotificationInit A pointer to a structure of function > pointers described in the type > + BOARD_NOTIFICATION_INIT_FUNC. > + > + @retval EFI_SUCCESS The board notification functions were > successfully registered. > + @retval EFI_INVALID_PARAMETER The pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to register the callback functions. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardNotificationInit ( > diff --git > a/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSuppo > rtLib/DxeMultiBoardInitSupportLib.c > b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSuppo > rtLib/DxeMultiBoardInitSupportLib.c > index 90aabdbbc7..3eb3a1adc7 100644 > --- > a/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSuppo > rtLib/DxeMultiBoardInitSupportLib.c > +++ b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitS > +++ upportLib/DxeMultiBoardInitSupportLib.c > @@ -1,6 +1,6 @@ > /** @file > > -Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -11,6 +11,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include > <Library/DebugLib.h> #include <Library/UefiBootServicesTableLib.h> > > +/** > + Registers the given set of board functions for callback to perform board > initialization tasks. > + > + When this function is called, the given structure of function > + pointers are stored for future invocation. When board initialization tasks > are required, the corresponding functions in this structure will be called. > + > + @param[in] BoardNotificationInit A pointer to a structure of function > pointers described in the type > + BOARD_NOTIFICATION_INIT_FUNC. > + > + @retval EFI_SUCCESS The board notification functions were > successfully registered. > + @retval EFI_INVALID_PARAMETER The pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to register the callback functions. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardNotificationInit ( > @@ -20,6 +34,10 @@ RegisterBoardNotificationInit ( > EFI_HANDLE Handle; > EFI_STATUS Status; > > + if (BoardNotificationInit == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > Handle = NULL; > Status = gBS->InstallProtocolInterface ( > &Handle, > @@ -27,7 +45,7 @@ RegisterBoardNotificationInit ( > EFI_NATIVE_INTERFACE, > BoardNotificationInit > ); > - ASSERT_EFI_ERROR(Status); > + ASSERT_EFI_ERROR (Status); > > - return EFI_SUCCESS; > + return Status; > } > diff --git > a/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSuppo > rtLib/PeiMultiBoardInitSupportLib.c > b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSuppo > rtLib/PeiMultiBoardInitSupportLib.c > index f1cd735e41..6f5b90d9b1 100644 > --- > a/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSuppo > rtLib/PeiMultiBoardInitSupportLib.c > +++ b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitS > +++ upportLib/PeiMultiBoardInitSupportLib.c > @@ -1,6 +1,6 @@ > /** @file > > -Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> > +Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -12,6 +12,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include > <Library/MemoryAllocationLib.h> #include <Library/PeiServicesLib.h> > > +/** > + Registers the given function for callback during board detection. > + > + When this function is called the given function pointer is added to > + an internal list. When board detection is performed within the > + BoardDetect() API, the function pointers in the list will be invoked until a > board detection function reports it has successfully detected the board. > + > + @param[in] BoardDetect A pointer to a function of type > BOARD_DETECT_FUNC that is called during > + board detection. > + > + @retval EFI_SUCCESS The function was successfully > registered. > + @retval EFI_INVALID_PARAMETER The function pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to add a new board detection callback. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardDetect ( > @@ -21,18 +36,42 @@ RegisterBoardDetect ( > EFI_STATUS Status; > EFI_PEI_PPI_DESCRIPTOR *PpiListBoardDetect; > > - PpiListBoardDetect = AllocatePool (sizeof(EFI_PEI_PPI_DESCRIPTOR)); > - ASSERT (PpiListBoardDetect != NULL); > + if (BoardDetect == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + PpiListBoardDetect = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); > + if (PpiListBoardDetect == NULL) { > + ASSERT (PpiListBoardDetect != NULL); > + return EFI_OUT_OF_RESOURCES; > + } > > PpiListBoardDetect->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); > PpiListBoardDetect->Guid = &gBoardDetectGuid; > PpiListBoardDetect->Ppi = BoardDetect; > > Status = PeiServicesInstallPpi (PpiListBoardDetect); > - ASSERT_EFI_ERROR(Status); > - return EFI_SUCCESS; > + ASSERT_EFI_ERROR (Status); > + > + return Status; > } > > +/** > + Registers the given set of board functions for callback to perform > pre-memory board initialization tasks. > + > + When this function is called, the given structure of function > + pointers are stored for future invocation. When board pre-memory > + initialization tasks are required, the corresponding pre-memory > + function in this structure will be called. Typically, > RegisterBoardPreMemInit() > is called during board detection with the successfully detected board > providing its set of board-specific pre-memory initialization functions. > + > + @param[in] BoardPreMemInit A pointer to a structure of function > pointers described in the type > + BOARD_PRE_MEM_INIT_FUNC. > + > + @retval EFI_SUCCESS The board pre-memory functions were > successfully registered. > + @retval EFI_INVALID_PARAMETER The pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to register the callback functions. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardPreMemInit ( > @@ -42,18 +81,42 @@ RegisterBoardPreMemInit ( > EFI_STATUS Status; > EFI_PEI_PPI_DESCRIPTOR *PpiListBoardInitPreMem; > > - PpiListBoardInitPreMem = AllocatePool (sizeof(EFI_PEI_PPI_DESCRIPTOR)); > - ASSERT (PpiListBoardInitPreMem != NULL); > + if (BoardPreMemInit == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + PpiListBoardInitPreMem = AllocatePool (sizeof > + (EFI_PEI_PPI_DESCRIPTOR)); if (PpiListBoardInitPreMem == NULL) { > + ASSERT (PpiListBoardInitPreMem != NULL); > + return EFI_OUT_OF_RESOURCES; > + } > > PpiListBoardInitPreMem->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); > PpiListBoardInitPreMem->Guid = &gBoardPreMemInitGuid; > PpiListBoardInitPreMem->Ppi = BoardPreMemInit; > > Status = PeiServicesInstallPpi (PpiListBoardInitPreMem); > - ASSERT_EFI_ERROR(Status); > - return EFI_SUCCESS; > + ASSERT_EFI_ERROR (Status); > + > + return Status; > } > > +/** > + Registers the given set of board functions for callback to perform > post-memory board initialization tasks. > + > + When this function is called, the given structure of function > + pointers are stored for future invocation. When board post-memory > + initialization tasks are required, the corresponding post-memory > + function in this structure will be called. Typically, > RegisterBoardPostMemInit() is called during board detection with the > successfuly detected board providing its set of board-specific post-memory > initialization functions. > + > + @param[in] BoardPostMemInit A pointer to a structure of function > pointers described in the type > + BOARD_POST_MEM_INIT_FUNC. > + > + @retval EFI_SUCCESS The board post-memory functions were > successfully registered. > + @retval EFI_INVALID_PARAMETER The pointer given is NULL. > + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources > exist to register the callback functions. > + > +**/ > EFI_STATUS > EFIAPI > RegisterBoardPostMemInit ( > @@ -63,14 +126,22 @@ RegisterBoardPostMemInit ( > EFI_STATUS Status; > EFI_PEI_PPI_DESCRIPTOR *PpiListBoardInitPostMem; > > - PpiListBoardInitPostMem = AllocatePool (sizeof(EFI_PEI_PPI_DESCRIPTOR)); > - ASSERT (PpiListBoardInitPostMem != NULL); > + if (BoardPostMemInit == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + PpiListBoardInitPostMem = AllocatePool (sizeof > + (EFI_PEI_PPI_DESCRIPTOR)); if (PpiListBoardInitPostMem == NULL) { > + ASSERT (PpiListBoardInitPostMem != NULL); > + return EFI_OUT_OF_RESOURCES; > + } > > PpiListBoardInitPostMem->Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); > PpiListBoardInitPostMem->Guid = &gBoardPostMemInitGuid; > PpiListBoardInitPostMem->Ppi = BoardPostMemInit; > > Status = PeiServicesInstallPpi (PpiListBoardInitPostMem); > - ASSERT_EFI_ERROR(Status); > - return EFI_SUCCESS; > + ASSERT_EFI_ERROR (Status); > + > + return Status; > } > -- > 2.16.2.windows.1 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#46355): https://edk2.groups.io/g/devel/message/46355 Mute This Topic: https://groups.io/mt/33007108/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-