From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.115, mailfrom: michael.a.kubacki@intel.com) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by groups.io with SMTP; Fri, 23 Aug 2019 16:24:30 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Aug 2019 16:24:30 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,422,1559545200"; d="scan'208";a="184352078" Received: from makuback-desk1.amr.corp.intel.com ([10.7.159.162]) by orsmga006.jf.intel.com with ESMTP; 23 Aug 2019 16:24:29 -0700 From: "Kubacki, Michael A" To: devel@edk2.groups.io Cc: Chasel Chiu , Nate DeSimone , Liming Gao Subject: [edk2-platforms][PATCH V1 1/1] MinPlatformPkg/MultiBoardInitSupportLib: Fix NULL pointer dereferences Date: Fri, 23 Aug 2019 16:24:20 -0700 Message-Id: <20190823232420.20184-1-michael.a.kubacki@intel.com> X-Mailer: git-send-email 2.16.2.windows.1 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 Cc: Nate DeSimone Cc: Liming Gao Signed-off-by: Michael Kubacki --- Platform/Intel/MinPlatformPkg/Include/Library/MultiBoardInitSupportLib.h | 84 ++++++++++++++++- Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/DxeMultiBoardInitSupportLib.c | 24 ++++- Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/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/MultiBoardInitSupportLib.h @@ -1,6 +1,6 @@ /** @file -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -10,18 +10,39 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include +/** + 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/MultiBoardInitSupportLib/DxeMultiBoardInitSupportLib.c b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/DxeMultiBoardInitSupportLib.c index 90aabdbbc7..3eb3a1adc7 100644 --- a/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/DxeMultiBoardInitSupportLib.c +++ b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/DxeMultiBoardInitSupportLib.c @@ -1,6 +1,6 @@ /** @file -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -11,6 +11,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +/** + 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/MultiBoardInitSupportLib/PeiMultiBoardInitSupportLib.c b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/PeiMultiBoardInitSupportLib.c index f1cd735e41..6f5b90d9b1 100644 --- a/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/PeiMultiBoardInitSupportLib.c +++ b/Platform/Intel/MinPlatformPkg/PlatformInit/Library/MultiBoardInitSupportLib/PeiMultiBoardInitSupportLib.c @@ -1,6 +1,6 @@ /** @file -Copyright (c) 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -12,6 +12,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +/** + 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