Reviewed-by: Jiaxin Wu <[email protected]>

> -----Original Message-----
> From: edk2-devel [mailto:[email protected]] On Behalf Of Fu,
> Siyuan
> Sent: Wednesday, December 13, 2017 4:07 PM
> To: [email protected]
> Cc: Ye, Ting <[email protected]>; Wang, Fan <[email protected]>; Wu,
> Jiaxin <[email protected]>
> Subject: [edk2] [Patch] MdeModulePkg/IpIoLib: Check the input parameters
> before use them.
> 
> This patch updates the DxeIpIoLib to check the input parameters before
> using.
> 
> Cc: Ye Ting <[email protected]>
> Cc: Wu Jiaxin <[email protected]>
> Cc: Wang Fan <[email protected]>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Fu Siyuan <[email protected]>
> ---
>  MdeModulePkg/Include/Library/IpIoLib.h       | 20 ++++----
>  MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c | 73
> ++++++++++++++++++++++------
>  2 files changed, 68 insertions(+), 25 deletions(-)
> 
> diff --git a/MdeModulePkg/Include/Library/IpIoLib.h
> b/MdeModulePkg/Include/Library/IpIoLib.h
> index aab0c68059..a57bc582d6 100644
> --- a/MdeModulePkg/Include/Library/IpIoLib.h
> +++ b/MdeModulePkg/Include/Library/IpIoLib.h
> @@ -2,7 +2,7 @@
>    This library is only intended to be used by UEFI network stack modules.
>    It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP6
> protocol.
> 
> -Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
>  This program and the accompanying materials are licensed and made
> available under
>  the terms and conditions of the BSD License that accompanies this
> distribution.
>  The full text of the license may be found at
> @@ -359,8 +359,9 @@ IpIoDestroy (
> 
>    @param[in, out]  IpIo            The pointer to the IP_IO instance that 
> needs to
> stop.
> 
> -  @retval          EFI_SUCCESS     The IP_IO instance stopped successfully.
> -  @retval          Others          Anrror condition occurred.
> +  @retval          EFI_SUCCESS            The IP_IO instance stopped 
> successfully.
> +  @retval          EFI_INVALID_PARAMETER  Invalid input parameter.
> +  @retval          Others                 Error condition occurred.
> 
>  **/
>  EFI_STATUS
> @@ -381,11 +382,12 @@ IpIoStop (
>    @param[in]       OpenData           The configuration data and callbacks 
> for
>                                        the IP_IO instance.
> 
> -  @retval          EFI_SUCCESS        The IP_IO instance opened with OpenData
> -                                      successfully.
> -  @retval          EFI_ACCESS_DENIED  The IP_IO instance is configured; avoid
> -                                      reopening it.
> -  @retval          Others             An error condition occurred.
> +  @retval          EFI_SUCCESS            The IP_IO instance opened with 
> OpenData
> +                                          successfully.
> +  @retval          EFI_ACCESS_DENIED      The IP_IO instance is configured,
> avoid to
> +                                          reopen it.
> +  @retval          EFI_INVALID_PARAMETER  Invalid input parameter.
> +  @retval          Others                 Error condition occurred.
> 
>  **/
>  EFI_STATUS
> @@ -518,7 +520,7 @@ IpIoRemoveIp (
>    @param[in]       Src               The local IP address.
> 
>    @return The pointer to the IP protocol can be used for sending purpose
> and its local
> -          address is the same with Src.
> +          address is the same with Src. NULL if failed.
> 
>  **/
>  IP_IO_IP_INFO *
> diff --git a/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
> b/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
> index abc07fb0ff..33e2863419 100644
> --- a/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
> +++ b/MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.c
> @@ -2,7 +2,7 @@
>    IpIo Library.
> 
>  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
> -Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
>  This program and the accompanying materials
>  are licensed and made available under the terms and conditions of the BSD
> License
>  which accompanies this distribution.  The full text of the license may be
> found at
> @@ -280,15 +280,22 @@ IpIoIcmpv4Handler (
>    UINT8                Type;
>    UINT8                Code;
>    UINT32               TrimBytes;
> -
> +
> +  ASSERT (IpIo != NULL);
> +  ASSERT (Pkt != NULL);
> +  ASSERT (Session != NULL);
>    ASSERT (IpIo->IpVersion == IP_VERSION_4);
> -
> -  IcmpHdr = NET_PROTO_HDR (Pkt, IP4_ICMP_ERROR_HEAD);
> -  IpHdr   = (EFI_IP4_HEADER *) (&IcmpHdr->IpHead);
> -
> +
>    //
>    // Check the ICMP packet length.
>    //
> +  if (Pkt->TotalSize < sizeof (IP4_ICMP_ERROR_HEAD)) {
> +    return EFI_ABORTED;
> +  }
> +
> +  IcmpHdr = NET_PROTO_HDR (Pkt, IP4_ICMP_ERROR_HEAD);
> +  IpHdr   = (EFI_IP4_HEADER *) (&IcmpHdr->IpHead);
> +
>    if (Pkt->TotalSize < ICMP_ERRLEN (IpHdr)) {
> 
>      return EFI_ABORTED;
> @@ -412,6 +419,9 @@ IpIoIcmpv6Handler (
>    UINT32               TrimBytes;
>    BOOLEAN              Flag;
> 
> +  ASSERT (IpIo != NULL);
> +  ASSERT (Pkt != NULL);
> +  ASSERT (Session != NULL);
>    ASSERT (IpIo->IpVersion == IP_VERSION_6);
> 
>    //
> @@ -1028,6 +1038,7 @@ IpIoListenHandlerDpc (
>    }
> 
>    if (IpIo->IpVersion == IP_VERSION_4) {
> +    ASSERT (RxData->Ip4RxData.Header != NULL);
>      if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (RxData->Ip4RxData.Header-
> >SourceAddress))) {
>        //
>        // The source address is a broadcast address, discard it.
> @@ -1052,6 +1063,11 @@ IpIoListenHandlerDpc (
>      }
> 
>      //
> +    // The fragment should always be valid for non-zero length packet.
> +    //
> +    ASSERT (RxData->Ip4RxData.FragmentCount != 0);
> +
> +    //
>      // Create a netbuffer representing IPv4 packet
>      //
>      Pkt = NetbufFromExt (
> @@ -1075,7 +1091,7 @@ IpIoListenHandlerDpc (
>      Session.IpHdrLen       = RxData->Ip4RxData.HeaderLength;
>      Session.IpVersion      = IP_VERSION_4;
>    } else {
> -
> +    ASSERT (RxData->Ip6RxData.Header != NULL);
>      if (!NetIp6IsValidUnicast(&RxData->Ip6RxData.Header->SourceAddress)) {
>        goto CleanUp;
>      }
> @@ -1088,6 +1104,11 @@ IpIoListenHandlerDpc (
>      }
> 
>      //
> +    // The fragment should always be valid for non-zero length packet.
> +    //
> +    ASSERT (RxData->Ip6RxData.FragmentCount != 0);
> +
> +    //
>      // Create a netbuffer representing IPv6 packet
>      //
>      Pkt = NetbufFromExt (
> @@ -1272,11 +1293,12 @@ ReleaseIpIo:
>    @param[in]       OpenData           The configuration data and callbacks 
> for
>                                        the IP_IO instance.
> 
> -  @retval          EFI_SUCCESS        The IP_IO instance opened with OpenData
> -                                      successfully.
> -  @retval          EFI_ACCESS_DENIED  The IP_IO instance is configured, avoid
> to
> -                                      reopen it.
> -  @retval          Others             Error condition occurred.
> +  @retval          EFI_SUCCESS            The IP_IO instance opened with 
> OpenData
> +                                          successfully.
> +  @retval          EFI_ACCESS_DENIED      The IP_IO instance is configured,
> avoid to
> +                                          reopen it.
> +  @retval          EFI_INVALID_PARAMETER  Invalid input parameter.
> +  @retval          Others                 Error condition occurred.
> 
>  **/
>  EFI_STATUS
> @@ -1289,6 +1311,10 @@ IpIoOpen (
>    EFI_STATUS        Status;
>    UINT8             IpVersion;
> 
> +  if (IpIo == NULL || OpenData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
>    if (IpIo->IsConfigured) {
>      return EFI_ACCESS_DENIED;
>    }
> @@ -1400,8 +1426,9 @@ ErrorExit:
> 
>    @param[in, out]  IpIo            Pointer to the IP_IO instance that needs 
> to stop.
> 
> -  @retval          EFI_SUCCESS     The IP_IO instance stopped successfully.
> -  @retval          Others          Error condition occurred.
> +  @retval          EFI_SUCCESS            The IP_IO instance stopped 
> successfully.
> +  @retval          EFI_INVALID_PARAMETER  Invalid input parameter.
> +  @retval          Others                 Error condition occurred.
> 
>  **/
>  EFI_STATUS
> @@ -1414,6 +1441,10 @@ IpIoStop (
>    IP_IO_IP_INFO     *IpInfo;
>    UINT8             IpVersion;
> 
> +  if (IpIo == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
>    if (!IpIo->IsConfigured) {
>      return EFI_SUCCESS;
>    }
> @@ -1916,6 +1947,10 @@ IpIoRemoveIp (
>  {
> 
>    UINT8               IpVersion;
> +
> +  if (IpIo == NULL || IpInfo == NULL) {
> +    return;
> +  }
> 
>    ASSERT (IpInfo->RefCnt > 0);
> 
> @@ -1980,7 +2015,7 @@ IpIoRemoveIp (
>    @param[in]       Src               The local IP address.
> 
>    @return Pointer to the IP protocol can be used for sending purpose and its
> local
> -          address is the same with Src.
> +          address is the same with Src. NULL if failed.
> 
>  **/
>  IP_IO_IP_INFO *
> @@ -1996,7 +2031,13 @@ IpIoFindSender (
>    LIST_ENTRY      *IpInfoEntry;
>    IP_IO_IP_INFO   *IpInfo;
> 
> -  ASSERT ((IpVersion == IP_VERSION_4) || (IpVersion == IP_VERSION_6));
> +  if (IpIo == NULL || Src == NULL) {
> +    return NULL;
> +  }
> +
> +  if ((IpVersion != IP_VERSION_4) && (IpVersion != IP_VERSION_6)) {
> +    return NULL;
> +  }
> 
>    NET_LIST_FOR_EACH (IpIoEntry, &mActiveIpIoList) {
>      IpIoPtr = NET_LIST_USER_STRUCT (IpIoEntry, IP_IO, Entry);
> --
> 2.13.0.windows.1
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to