public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kubacki, Michael A" <michael.a.kubacki@intel.com>
To: devel@edk2.groups.io
Cc: Chasel Chiu <chasel.chiu@intel.com>,
	Nate DeSimone <nathaniel.l.desimone@intel.com>,
	Liming Gao <liming.gao@intel.com>
Subject: [edk2-platforms][PATCH V1 1/1] MinPlatformPkg/MultiBoardInitSupportLib: Fix NULL pointer dereferences
Date: Fri, 23 Aug 2019 16:24:20 -0700	[thread overview]
Message-ID: <20190823232420.20184-1-michael.a.kubacki@intel.com> (raw)

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.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Michael Kubacki <michael.a.kubacki@intel.com>
---
 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.<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/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.<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/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.<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


             reply	other threads:[~2019-08-23 23:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-23 23:24 Kubacki, Michael A [this message]
2019-08-23 23:44 ` [edk2-platforms][PATCH V1 1/1] MinPlatformPkg/MultiBoardInitSupportLib: Fix NULL pointer dereferences Nate DeSimone
2019-08-26  7:28 ` [edk2-devel] " Chiu, Chasel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190823232420.20184-1-michael.a.kubacki@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox