[edk2-devel] [edk2-platforms][PATCH V1 1/1] MinPlatformPkg/MultiBoardInitSupportLib: Fix NULL pointer dereferences

Chiu, Chasel chasel.chiu at intel.com
Mon Aug 26 07:28:21 UTC 2019


Reviewed-by: Chasel Chiu <chasel.chiu at intel.com>


> -----Original Message-----
> From: devel at edk2.groups.io [mailto:devel at edk2.groups.io] On Behalf Of
> Kubacki, Michael A
> Sent: Saturday, August 24, 2019 7:24 AM
> To: devel at edk2.groups.io
> Cc: Chiu, Chasel <chasel.chiu at intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone at intel.com>; Gao, Liming <liming.gao at 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.chiu at intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone at intel.com>
> Cc: Liming Gao <liming.gao at intel.com>
> Signed-off-by: Michael Kubacki <michael.a.kubacki at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list