Reviewed-by: Jiaxin Wu <jiaxin...@intel.com>

> -----Original Message-----
> From: Wang, Fan
> Sent: Wednesday, January 3, 2018 10:32 AM
> To: edk2-devel@lists.01.org
> Cc: Wang, Fan <fan.w...@intel.com>; Fu, Siyuan <siyuan...@intel.com>; Ye,
> Ting <ting...@intel.com>; Wu, Jiaxin <jiaxin...@intel.com>
> Subject: [Patch 2/3] MdeModulePkg/DxeNetLib: Add parameter check and
> ASSERT handling.
> 
> From: Wang Fan <fan.w...@intel.com>
> 
> * Library API should check the input parameters before use, or
>   ASSERT to tell it has to meet some requirements. But in DxeNetLib,
>   not all functions follows this rule.
> * ASSERT shouldn't be used as error handling, add some handling code
>   for errors.
> * Add some ASSERT commence in function notes.
> 
> Cc: Fu Siyuan <siyuan...@intel.com>
> Cc: Ye Ting <ting...@intel.com>
> Cc: Jiaxin Wu <jiaxin...@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Wang Fan <fan.w...@intel.com>
> ---
>  MdeModulePkg/Library/DxeNetLib/DxeNetLib.c | 119
> +++++++++++++++++++++++++----
>  1 file changed, 105 insertions(+), 14 deletions(-)
> 
> diff --git a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
> b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
> index 0f00f79..90f17b7 100644
> --- a/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
> +++ b/MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
> @@ -1,9 +1,9 @@
>  /** @file
>    Network library.
> 
> -Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
>  (C) Copyright 2015 Hewlett Packard Enterprise Development LP<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
>  http://opensource.org/licenses/bsd-license.php
> @@ -196,10 +196,11 @@ SyslogLocateSnp (
>    Transmit a syslog packet synchronously through SNP. The Packet
>    already has the ethernet header prepended. This function should
>    fill in the source MAC because it will try to locate a SNP each
>    time it is called to avoid the problem if SNP is unloaded.
>    This code snip is copied from MNP.
> +  If Packet is NULL, then ASSERT().
> 
>    @param[in] Packet          The Syslog packet
>    @param[in] Length          The length of the packet
> 
>    @retval EFI_DEVICE_ERROR   Failed to locate a usable SNP protocol
> @@ -217,10 +218,12 @@ SyslogSendPacket (
>    ETHER_HEAD                  *Ether;
>    EFI_STATUS                  Status;
>    EFI_EVENT                   TimeoutEvent;
>    UINT8                       *TxBuf;
> 
> +  ASSERT (Packet != NULL);
> +
>    Snp = SyslogLocateSnp ();
> 
>    if (Snp == NULL) {
>      return EFI_DEVICE_ERROR;
>    }
> @@ -308,11 +311,11 @@ ON_EXIT:
>    @param[in]  Line      The line of code in the File that contains the 
> current log
>    @param[in]  Message   The log message
>    @param[in]  BufLen    The lenght of the Buf
>    @param[out] Buf       The buffer to put the packet data
> 
> -  @return The length of the syslog packet built.
> +  @return The length of the syslog packet built, 0 represents no packet is
> built.
> 
>  **/
>  UINT32
>  SyslogBuildPacket (
>    IN  UINT32                Level,
> @@ -322,10 +325,11 @@ SyslogBuildPacket (
>    IN  UINT8                 *Message,
>    IN  UINT32                BufLen,
>    OUT CHAR8                 *Buf
>    )
>  {
> +  EFI_STATUS                Status;
>    ETHER_HEAD                *Ether;
>    IP4_HEAD                  *Ip4;
>    EFI_UDP_HEADER            *Udp4;
>    EFI_TIME                  Time;
>    UINT32                    Pri;
> @@ -377,12 +381,14 @@ SyslogBuildPacket (
> 
>    //
>    // Build the syslog message body with <PRI> Timestamp  machine module
> Message
>    //
>    Pri = ((NET_SYSLOG_FACILITY & 31) << 3) | (Level & 7);
> -  gRT->GetTime (&Time, NULL);
> -  ASSERT ((Time.Month <= 12) && (Time.Month >= 1));
> +  Status = gRT->GetTime (&Time, NULL);
> +  if (EFI_ERROR (Status)) {
> +    return 0;
> +  }
> 
>    //
>    // Use %a to format the ASCII strings, %s to format UNICODE strings
>    //
>    Len  = 0;
> @@ -437,10 +443,12 @@ SyslogBuildPacket (
>             __FILE__,
>             __LINE__,
>             NetDebugASPrint ("State transit to %a\n", Name)
>           )
> 
> +  If Format is NULL, then ASSERT().
> +
>    @param Format  The ASCII format string.
>    @param ...     The variable length parameter whose format is determined
>                   by the Format string.
> 
>    @return        The buffer containing the formatted message,
> @@ -455,10 +463,12 @@ NetDebugASPrint (
>    )
>  {
>    VA_LIST                   Marker;
>    CHAR8                     *Buf;
> 
> +  ASSERT (Format != NULL);
> +
>    Buf = (CHAR8 *) AllocatePool (NET_DEBUG_MSG_LEN);
> 
>    if (Buf == NULL) {
>      return NULL;
>    }
> @@ -481,11 +491,12 @@ NetDebugASPrint (
>    @param File     The file that contains the log.
>    @param Line     The exact line that contains the log.
>    @param Message  The user message to log.
> 
>    @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
> -  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the
> packet
> +  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the
> packet.
> +  @retval EFI_DEVICE_ERROR      Device error occurs.
>    @retval EFI_SUCCESS           The log is discard because that it is more 
> verbose
>                                  than the mNetDebugLevelMax. Or, it has been 
> sent out.
>  **/
>  EFI_STATUS
>  EFIAPI
> @@ -502,11 +513,11 @@ NetDebugOutput (
>    EFI_STATUS                   Status;
> 
>    //
>    // Check whether the message should be sent out
>    //
> -  if (Message == NULL) {
> +  if (Message == NULL || File == NULL || Module == NULL) {
>      return EFI_INVALID_PARAMETER;
>    }
> 
>    if (Level > mNetDebugLevelMax) {
>      Status = EFI_SUCCESS;
> @@ -535,13 +546,17 @@ NetDebugOutput (
>            Line,
>            Message,
>            NET_SYSLOG_PACKET_LEN,
>            Packet
>            );
> +  if (Len == 0) {
> +    Status = EFI_DEVICE_ERROR;
> +  } else {
> +    mSyslogPacketSeq++;
> +    Status = SyslogSendPacket (Packet, Len);
> +  }
> 
> -  mSyslogPacketSeq++;
> -  Status = SyslogSendPacket (Packet, Len);
>    FreePool (Packet);
> 
>  ON_EXIT:
>    FreePool (Message);
>    return Status;
> @@ -673,10 +688,12 @@ NetIp4IsUnicast (
>  }
> 
>  /**
>    Check whether the incoming IPv6 address is a valid unicast address.
> 
> +  ASSERT if Ip6 is NULL.
> +
>    If the address is a multicast address has binary 0xFF at the start, it is 
> not
>    a valid unicast address. If the address is unspecified ::, it is not a 
> valid
>    unicast address to be assigned to any node. If the address is loopback
> address
>    ::1, it is also not a valid unicast address to be assigned to any physical
>    interface.
> @@ -693,10 +710,12 @@ NetIp6IsValidUnicast (
>    )
>  {
>    UINT8 Byte;
>    UINT8 Index;
> 
> +  ASSERT (Ip6 != NULL);
> +
>    if (Ip6->Addr[0] == 0xFF) {
>      return FALSE;
>    }
> 
>    for (Index = 0; Index < 15; Index++) {
> @@ -715,10 +734,12 @@ NetIp6IsValidUnicast (
>  }
> 
>  /**
>    Check whether the incoming Ipv6 address is the unspecified address or not.
> 
> +  ASSERT if Ip6 is NULL.
> +
>    @param[in] Ip6   - Ip6 address, in network order.
> 
>    @retval TRUE     - Yes, unspecified
>    @retval FALSE    - No
> 
> @@ -729,10 +750,12 @@ NetIp6IsUnspecifiedAddr (
>    IN EFI_IPv6_ADDRESS       *Ip6
>    )
>  {
>    UINT8 Index;
> 
> +  ASSERT (Ip6 != NULL);
> +
>    for (Index = 0; Index < 16; Index++) {
>      if (Ip6->Addr[Index] != 0) {
>        return FALSE;
>      }
>    }
> @@ -741,10 +764,12 @@ NetIp6IsUnspecifiedAddr (
>  }
> 
>  /**
>    Check whether the incoming Ipv6 address is a link-local address.
> 
> +  ASSERT if Ip6 is NULL.
> +
>    @param[in] Ip6   - Ip6 address, in network order.
> 
>    @retval TRUE  - Yes, link-local address
>    @retval FALSE - No
> 
> @@ -777,10 +802,13 @@ NetIp6IsLinkLocalAddr (
>  }
> 
>  /**
>    Check whether the Ipv6 address1 and address2 are on the connected
> network.
> 
> +  ASSERT if Ip1 or Ip2 is NULL.
> +  ASSERT if PrefixLength exceeds IP6_PREFIX_MAX.
> +
>    @param[in] Ip1          - Ip6 address1, in network order.
>    @param[in] Ip2          - Ip6 address2, in network order.
>    @param[in] PrefixLength - The prefix length of the checking net.
> 
>    @retval TRUE            - Yes, connected.
> @@ -813,11 +841,10 @@ NetIp6IsNetEqual (
>    }
> 
>    if (Bit > 0) {
>      Mask = (UINT8) (0xFF << (8 - Bit));
> 
> -    ASSERT (Byte < 16);
>      if ((Ip1->Addr[Byte] & Mask) != (Ip2->Addr[Byte] & Mask)) {
>        return FALSE;
>      }
>    }
> 
> @@ -826,10 +853,12 @@ NetIp6IsNetEqual (
> 
> 
>  /**
>    Switches the endianess of an IPv6 address
> 
> +  ASSERT if Ip6 is NULL.
> +
>    This function swaps the bytes in a 128-bit IPv6 address to switch the value
>    from little endian to big endian or vice versa. The byte swapped value is
>    returned.
> 
>    @param  Ip6 Points to an IPv6 address
> @@ -844,10 +873,12 @@ Ip6Swap128 (
>    )
>  {
>    UINT64 High;
>    UINT64 Low;
> 
> +  ASSERT (Ip6 != NULL);
> +
>    CopyMem (&High, Ip6, sizeof (UINT64));
>    CopyMem (&Low, &Ip6->Addr[8], sizeof (UINT64));
> 
>    High = SwapBytes64 (High);
>    Low  = SwapBytes64 (Low);
> @@ -891,10 +922,12 @@ NetRandomInitSeed (
> 
> 
>  /**
>    Extract a UINT32 from a byte stream.
> 
> +  ASSERT if Buf is NULL.
> +
>    Copy a UINT32 from a byte stream, then converts it from Network
>    byte order to host byte order. Use this function to avoid alignment error.
> 
>    @param[in]  Buf                 The buffer to extract the UINT32.
> 
> @@ -907,18 +940,22 @@ NetGetUint32 (
>    IN UINT8                  *Buf
>    )
>  {
>    UINT32                    Value;
> 
> +  ASSERT (Buf != NULL);
> +
>    CopyMem (&Value, Buf, sizeof (UINT32));
>    return NTOHL (Value);
>  }
> 
> 
>  /**
>    Put a UINT32 to the byte stream in network byte order.
> 
> +  ASSERT if Buf is NULL.
> +
>    Converts a UINT32 from host byte order to network byte order. Then copy
> it to the
>    byte stream.
> 
>    @param[in, out]  Buf          The buffer to put the UINT32.
>    @param[in]       Data         The data to be converted and put into the 
> byte
> stream.
> @@ -929,10 +966,12 @@ EFIAPI
>  NetPutUint32 (
>    IN OUT UINT8                 *Buf,
>    IN     UINT32                Data
>    )
>  {
> +  ASSERT (Buf != NULL);
> +
>    Data = HTONL (Data);
>    CopyMem (Buf, &Data, sizeof (UINT32));
>  }
> 
> 
> @@ -1027,10 +1066,12 @@ NetListRemoveTail (
> 
> 
>  /**
>    Insert a new node entry after a designated node entry of a doubly linked
> list.
> 
> +  ASSERT if PrevEntry or NewEntry is NULL.
> +
>    Inserts a new node entry donated by NewEntry after the node entry
> donated by PrevEntry
>    of the doubly linked list.
> 
>    @param[in, out]  PrevEntry             The previous entry to insert after.
>    @param[in, out]  NewEntry              The new entry to insert.
> @@ -1041,20 +1082,24 @@ EFIAPI
>  NetListInsertAfter (
>    IN OUT LIST_ENTRY         *PrevEntry,
>    IN OUT LIST_ENTRY         *NewEntry
>    )
>  {
> +  ASSERT (PrevEntry != NULL && NewEntry != NULL);
> +
>    NewEntry->BackLink                = PrevEntry;
>    NewEntry->ForwardLink             = PrevEntry->ForwardLink;
>    PrevEntry->ForwardLink->BackLink  = NewEntry;
>    PrevEntry->ForwardLink            = NewEntry;
>  }
> 
> 
>  /**
>    Insert a new node entry before a designated node entry of a doubly linked
> list.
> 
> +  ASSERT if PostEntry or NewEntry is NULL.
> +
>    Inserts a new node entry donated by NewEntry after the node entry
> donated by PostEntry
>    of the doubly linked list.
> 
>    @param[in, out]  PostEntry             The entry to insert before.
>    @param[in, out]  NewEntry              The new entry to insert.
> @@ -1065,10 +1110,12 @@ EFIAPI
>  NetListInsertBefore (
>    IN OUT LIST_ENTRY     *PostEntry,
>    IN OUT LIST_ENTRY     *NewEntry
>    )
>  {
> +  ASSERT (PostEntry != NULL && NewEntry != NULL);
> +
>    NewEntry->ForwardLink             = PostEntry;
>    NewEntry->BackLink                = PostEntry->BackLink;
>    PostEntry->BackLink->ForwardLink  = NewEntry;
>    PostEntry->BackLink               = NewEntry;
>  }
> @@ -1263,11 +1310,10 @@ NetMapClean (
> 
>    If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.
> 
>    If Map is NULL, then ASSERT().
> 
> -
>    @param[in]  Map                   The net map to test.
> 
>    @return TRUE if the netmap is empty, otherwise FALSE.
> 
>  **/
> @@ -1283,10 +1329,12 @@ NetMapIsEmpty (
> 
> 
>  /**
>    Return the number of the <Key, Value> pairs in the netmap.
> 
> +  If Map is NULL, then ASSERT().
> +
>    @param[in]  Map                   The netmap to get the entry number.
> 
>    @return The entry number in the netmap.
> 
>  **/
> @@ -1294,10 +1342,11 @@ UINTN
>  EFIAPI
>  NetMapGetCount (
>    IN NET_MAP                *Map
>    )
>  {
> +  ASSERT (Map != NULL);
>    return Map->Count;
>  }
> 
> 
>  /**
> @@ -1358,10 +1407,11 @@ NetMapAllocItem (
>    Allocate an item to save the <Key, Value> pair and add corresponding node
> entry
>    to the beginning of the Used doubly linked list. The number of the <Key,
> Value>
>    pairs in the netmap increase by 1.
> 
>    If Map is NULL, then ASSERT().
> +  If Key is NULL, then ASSERT().
> 
>    @param[in, out]  Map                   The netmap to insert into.
>    @param[in]       Key                   The user's key.
>    @param[in]       Value                 The user's value for the key.
> 
> @@ -1377,11 +1427,11 @@ NetMapInsertHead (
>    IN VOID                   *Value    OPTIONAL
>    )
>  {
>    NET_MAP_ITEM              *Item;
> 
> -  ASSERT (Map != NULL);
> +  ASSERT (Map != NULL && Key != NULL);
> 
>    Item = NetMapAllocItem (Map);
> 
>    if (Item == NULL) {
>      return EFI_OUT_OF_RESOURCES;
> @@ -1402,10 +1452,11 @@ NetMapInsertHead (
>    Allocate an item to save the <Key, Value> pair and add corresponding node
> entry
>    to the tail of the Used doubly linked list. The number of the <Key, Value>
>    pairs in the netmap increase by 1.
> 
>    If Map is NULL, then ASSERT().
> +  If Key is NULL, then ASSERT().
> 
>    @param[in, out]  Map                   The netmap to insert into.
>    @param[in]       Key                   The user's key.
>    @param[in]       Value                 The user's value for the key.
> 
> @@ -1421,11 +1472,11 @@ NetMapInsertTail (
>    IN VOID                   *Value    OPTIONAL
>    )
>  {
>    NET_MAP_ITEM              *Item;
> 
> -  ASSERT (Map != NULL);
> +  ASSERT (Map != NULL && Key != NULL);
> 
>    Item = NetMapAllocItem (Map);
> 
>    if (Item == NULL) {
>      return EFI_OUT_OF_RESOURCES;
> @@ -1442,10 +1493,13 @@ NetMapInsertTail (
> 
> 
>  /**
>    Check whether the item is in the Map and return TRUE if it is.
> 
> +  If Map is NULL, then ASSERT().
> +  If Item is NULL, then ASSERT().
> +
>    @param[in]  Map                   The netmap to search within.
>    @param[in]  Item                  The item to search.
> 
>    @return TRUE if the item is in the netmap, otherwise FALSE.
> 
> @@ -1456,10 +1510,12 @@ NetItemInMap (
>    IN NET_MAP_ITEM           *Item
>    )
>  {
>    LIST_ENTRY            *ListEntry;
> 
> +  ASSERT (Map != NULL && Item != NULL);
> +
>    NET_LIST_FOR_EACH (ListEntry, &Map->Used) {
>      if (ListEntry == &Item->Link) {
>        return TRUE;
>      }
>    }
> @@ -1473,10 +1529,11 @@ NetItemInMap (
> 
>    Iterate the Used doubly linked list of the netmap to get every item.
> Compare the key of every
>    item with the key to search. It returns the point to the item contains the
> Key if found.
> 
>    If Map is NULL, then ASSERT().
> +  If Key is NULL, then ASSERT().
> 
>    @param[in]  Map                   The netmap to search within.
>    @param[in]  Key                   The key to search.
> 
>    @return The point to the item contains the Key, or NULL if Key isn't in the
> map.
> @@ -1490,11 +1547,11 @@ NetMapFindKey (
>    )
>  {
>    LIST_ENTRY              *Entry;
>    NET_MAP_ITEM            *Item;
> 
> -  ASSERT (Map != NULL);
> +  ASSERT (Map != NULL && Key != NULL);
> 
>    NET_LIST_FOR_EACH (Entry, &Map->Used) {
>      Item = NET_LIST_USER_STRUCT (Entry, NET_MAP_ITEM, Link);
> 
>      if (Item->Key == Key) {
> @@ -2093,10 +2150,13 @@ NetLibGetVlanHandle (
>  }
> 
>  /**
>    Get MAC address associated with the network service handle.
> 
> +  If MacAddress is NULL, then ASSERT().
> +  If AddressSize is NULL, then ASSERT().
> +
>    There should be MNP Service Binding Protocol installed on the input
> ServiceHandle.
>    If SNP is installed on the ServiceHandle or its parent handle, MAC address
> will
>    be retrieved from SNP. If no SNP found, try to get SNP mode data use MNP.
> 
>    @param[in]   ServiceHandle    The handle where network service binding
> protocols are
> @@ -2197,10 +2257,12 @@ NetLibGetMacAddress (
> 
>  /**
>    Convert MAC address of the NIC associated with specified Service Binding
> Handle
>    to a unicode string. Callers are responsible for freeing the string 
> storage.
> 
> +  If MacString is NULL, then ASSERT().
> +
>    Locate simple network protocol associated with the Service Binding Handle
> and
>    get the mac address from SNP. Then convert the mac address into a
> unicode
>    string. It takes 2 unicode characters to represent a 1 byte binary buffer.
>    Plus one unicode character for the null-terminator.
> 
> @@ -2296,10 +2358,12 @@ NetLibGetMacString (
>  }
> 
>  /**
>    Detect media status for specified network device.
> 
> +  If MediaPresent is NULL, then ASSERT().
> +
>    The underlying UNDI driver may or may not support reporting media status
> from
>    GET_STATUS command
> (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine
>    will try to invoke Snp->GetStatus() to get the media status: if media 
> already
>    present, it return directly; if media not present, it will stop SNP and 
> then
>    restart SNP to get the latest media status, this give chance to get the
> correct
> @@ -2404,10 +2468,14 @@ NetLibDetectMedia (
>        MCastFilter = AllocateCopyPool (
>                        MCastFilterCount * sizeof (EFI_MAC_ADDRESS),
>                        Snp->Mode->MCastFilter
>                        );
>        ASSERT (MCastFilter != NULL);
> +      if (MCastFilter == NULL) {
> +        Status = EFI_OUT_OF_RESOURCES;
> +        goto Exit;
> +      }
> 
>        ResetMCastFilters = FALSE;
>      }
> 
>      //
> @@ -2735,10 +2803,12 @@ ON_EXIT:
>  }
> 
>  /**
>    Create an IPv4 device path node.
> 
> +  If Node is NULL, then ASSERT().
> +
>    The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.
>    The header subtype of IPv4 device path node is MSG_IPv4_DP.
>    Get other info from parameters to make up the whole IPv4 device path
> node.
> 
>    @param[in, out]  Node                  Pointer to the IPv4 device path 
> node.
> @@ -2762,10 +2832,12 @@ NetLibCreateIPv4DPathNode (
>    IN UINT16                RemotePort,
>    IN UINT16                Protocol,
>    IN BOOLEAN               UseDefaultAddress
>    )
>  {
> +  ASSERT (Node != NULL);
> +
>    Node->Header.Type    = MESSAGING_DEVICE_PATH;
>    Node->Header.SubType = MSG_IPv4_DP;
>    SetDevicePathNodeLength (&Node->Header, sizeof (IPv4_DEVICE_PATH));
> 
>    CopyMem (&Node->LocalIpAddress, &LocalIp, sizeof (EFI_IPv4_ADDRESS));
> @@ -2792,10 +2864,14 @@ NetLibCreateIPv4DPathNode (
>  }
> 
>  /**
>    Create an IPv6 device path node.
> 
> +  If Node is NULL, then ASSERT().
> +  If LocalIp is NULL, then ASSERT().
> +  If RemoteIp is NULL, then ASSERT().
> +
>    The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.
>    The header subtype of IPv6 device path node is MSG_IPv6_DP.
>    Get other info from parameters to make up the whole IPv6 device path
> node.
> 
>    @param[in, out]  Node                  Pointer to the IPv6 device path 
> node.
> @@ -2817,10 +2893,12 @@ NetLibCreateIPv6DPathNode (
>    IN EFI_IPv6_ADDRESS      *RemoteIp,
>    IN UINT16                RemotePort,
>    IN UINT16                Protocol
>    )
>  {
> +  ASSERT (Node != NULL && LocalIp != NULL && RemoteIp != NULL);
> +
>    Node->Header.Type    = MESSAGING_DEVICE_PATH;
>    Node->Header.SubType = MSG_IPv6_DP;
>    SetDevicePathNodeLength (&Node->Header, sizeof (IPv6_DEVICE_PATH));
> 
>    CopyMem (&Node->LocalIpAddress, LocalIp, sizeof (EFI_IPv6_ADDRESS));
> @@ -2841,10 +2919,12 @@ NetLibCreateIPv6DPathNode (
>  }
> 
>  /**
>    Find the UNDI/SNP handle from controller and protocol GUID.
> 
> +  If ProtocolGuid is NULL, then ASSERT().
> +
>    For example, IP will open a MNP child to transmit/receive
>    packets, when MNP is stopped, IP should also be stopped. IP
>    needs to find its own private data which is related the IP's
>    service binding instance that is install on UNDI/SNP handle.
>    Now, the controller is either a MNP or ARP child handle. But
> @@ -2868,10 +2948,12 @@ NetLibGetNicHandle (
>    EFI_HANDLE                          Handle;
>    EFI_STATUS                          Status;
>    UINTN                               OpenCount;
>    UINTN                               Index;
> 
> +  ASSERT (ProtocolGuid != NULL);
> +
>    Status = gBS->OpenProtocolInformation (
>                    Controller,
>                    ProtocolGuid,
>                    &OpenBuffer,
>                    &OpenCount
> @@ -3149,10 +3231,12 @@ NetLibIp6ToStr (
>  }
> 
>  /**
>    This function obtains the system guid from the smbios table.
> 
> +  If SystemGuid is NULL, then ASSERT().
> +
>    @param[out]  SystemGuid     The pointer of the returned system guid.
> 
>    @retval EFI_SUCCESS         Successfully obtained the system guid.
>    @retval EFI_NOT_FOUND       Did not find the SMBIOS table.
> 
> @@ -3168,10 +3252,12 @@ NetLibGetSystemGuid (
>    SMBIOS_TABLE_3_0_ENTRY_POINT  *Smbios30Table;
>    SMBIOS_STRUCTURE_POINTER      Smbios;
>    SMBIOS_STRUCTURE_POINTER      SmbiosEnd;
>    CHAR8                         *String;
> 
> +  ASSERT (SystemGuid != NULL);
> +
>    SmbiosTable = NULL;
>    Status = EfiGetSystemConfigurationTable (&gEfiSmbios3TableGuid, (VOID
> **) &Smbios30Table);
>    if (!(EFI_ERROR (Status) || Smbios30Table == NULL)) {
>      Smbios.Hdr = (SMBIOS_STRUCTURE *) (UINTN) Smbios30Table-
> >TableAddress;
>      SmbiosEnd.Raw = (UINT8 *) (UINTN) (Smbios30Table->TableAddress +
> Smbios30Table->TableMaximumSize);
> @@ -3234,11 +3320,14 @@ NetLibGetSystemGuid (
>    } while (Smbios.Raw < SmbiosEnd.Raw);
>    return EFI_NOT_FOUND;
>  }
> 
>  /**
> -  Create Dns QName according the queried domain name.
> +  Create Dns QName according the queried domain name.
> +
> +  If DomainName is NULL, then ASSERT().
> +
>    QName is a domain name represented as a sequence of labels,
>    where each label consists of a length octet followed by that
>    number of octets. The QName terminates with the zero
>    length octet for the null label of the root. Caller should
>    take responsibility to free the buffer in returned pointer.
> @@ -3260,10 +3349,12 @@ NetLibCreateDnsQName (
>    CHAR8                 *Header;
>    CHAR8                 *Tail;
>    UINTN                 Len;
>    UINTN                 Index;
> 
> +  ASSERT (DomainName != NULL);
> +
>    QueryName     = NULL;
>    QueryNameSize = 0;
>    Header        = NULL;
>    Tail          = NULL;
> 
> --
> 1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to