]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
MdePkg/Include: Add enumeration size checks to Base.h
[mirror_edk2.git] / MdeModulePkg / Library / DxeNetLib / DxeNetLib.c
index e112d45ef21c45414cf9a939183e68d25200f7ab..148bebf4e7fdd1ebbf1400438eb4d8a9c19df9e6 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Network library.\r
 \r
-Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2005 - 2016, Intel Corporation. All rights reserved.<BR>\r
 (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -301,7 +301,7 @@ ON_EXIT:
   Build a syslog packet, including the Ethernet/Ip/Udp headers\r
   and user's message.\r
 \r
-  @param[in]  Level     Syslog servity level\r
+  @param[in]  Level     Syslog severity level\r
   @param[in]  Module    The module that generates the log\r
   @param[in]  File      The file that contains the current log\r
   @param[in]  Line      The line of code in the File that contains the current log\r
@@ -475,7 +475,7 @@ NetDebugASPrint (
   This function will locate a instance of SNP then send the message through it.\r
   Because it isn't open the SNP BY_DRIVER, apply caution when using it.\r
 \r
-  @param Level    The servity level of the message.\r
+  @param Level    The severity level of the message.\r
   @param Module   The Moudle that generates the log.\r
   @param File     The file that contains the log.\r
   @param Line     The exact line that contains the log.\r
@@ -565,7 +565,7 @@ NetGetMaskLength (
 {\r
   INTN                      Index;\r
 \r
-  for (Index = 0; Index < IP4_MASK_NUM; Index++) {\r
+  for (Index = 0; Index <= IP4_MASK_MAX; Index++) {\r
     if (NetMask == gIp4AllMasks[Index]) {\r
       break;\r
     }\r
@@ -794,7 +794,7 @@ NetIp6IsNetEqual (
   UINT8 Bit;\r
   UINT8 Mask;\r
 \r
-  ASSERT ((Ip1 != NULL) && (Ip2 != NULL) && (PrefixLength < IP6_PREFIX_NUM));\r
+  ASSERT ((Ip1 != NULL) && (Ip2 != NULL) && (PrefixLength <= IP6_PREFIX_MAX));\r
 \r
   if (PrefixLength == 0) {\r
     return TRUE;\r
@@ -1151,7 +1151,7 @@ NetDestroyLinkList (
   @param[in]  ChildHandleBuffer  An array of child handles to be freed. May be NULL\r
                                  if NumberOfChildren is 0.\r
 \r
-  @retval TURE                   Found the input Handle in ChildHandleBuffer.\r
+  @retval TRUE                   Found the input Handle in ChildHandleBuffer.\r
   @retval FALSE                  Can't find the input Handle in ChildHandleBuffer.\r
 \r
 **/\r
@@ -1636,7 +1636,7 @@ NetMapRemoveTail (
 /**\r
   Iterate through the netmap and call CallBack for each item.\r
 \r
-  It will contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break\r
+  It will continue the traverse if CallBack returns EFI_SUCCESS, otherwise, break\r
   from the loop. It returns the CallBack's last return value. This function is\r
   delete safe for the current item.\r
 \r
@@ -2726,6 +2726,9 @@ NetLibAsciiStrToIp4 (
     TempStr = Ip4Str;\r
 \r
     while ((*Ip4Str != '\0') && (*Ip4Str != '.')) {\r
+      if (!NET_IS_DIGIT (*Ip4Str)) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
       Ip4Str++;\r
     }\r
 \r
@@ -2762,7 +2765,7 @@ NetLibAsciiStrToIp4 (
 \r
 /**\r
   Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the\r
-  string is defined in RFC 4291 - Text Pepresentation of Addresses.\r
+  string is defined in RFC 4291 - Text Representation of Addresses.\r
 \r
   @param[in]      String         The pointer to the Ascii string.\r
   @param[out]     Ip6Address     The pointer to the converted IPv6 address.\r
@@ -2976,18 +2979,20 @@ NetLibStrToIp4 (
   )\r
 {\r
   CHAR8                          *Ip4Str;\r
+  UINTN                          StringSize;\r
   EFI_STATUS                     Status;\r
 \r
   if ((String == NULL) || (Ip4Address == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Ip4Str = (CHAR8 *) AllocatePool ((StrLen (String) + 1) * sizeof (CHAR8));\r
+  StringSize = StrLen (String) + 1;\r
+  Ip4Str = (CHAR8 *) AllocatePool (StringSize * sizeof (CHAR8));\r
   if (Ip4Str == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  UnicodeStrToAsciiStr (String, Ip4Str);\r
+  UnicodeStrToAsciiStrS (String, Ip4Str, StringSize);\r
 \r
   Status = NetLibAsciiStrToIp4 (Ip4Str, Ip4Address);\r
 \r
@@ -2999,7 +3004,7 @@ NetLibStrToIp4 (
 \r
 /**\r
   Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS.  The format of\r
-  the string is defined in RFC 4291 - Text Pepresentation of Addresses.\r
+  the string is defined in RFC 4291 - Text Representation of Addresses.\r
 \r
   @param[in]      String         The pointer to the Ascii string.\r
   @param[out]     Ip6Address     The pointer to the converted IPv6 address.\r
@@ -3017,18 +3022,20 @@ NetLibStrToIp6 (
   )\r
 {\r
   CHAR8                          *Ip6Str;\r
+  UINTN                          StringSize;\r
   EFI_STATUS                     Status;\r
 \r
   if ((String == NULL) || (Ip6Address == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Ip6Str = (CHAR8 *) AllocatePool ((StrLen (String) + 1) * sizeof (CHAR8));\r
+  StringSize = StrLen (String) + 1;\r
+  Ip6Str = (CHAR8 *) AllocatePool (StringSize * sizeof (CHAR8));\r
   if (Ip6Str == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  UnicodeStrToAsciiStr (String, Ip6Str);\r
+  UnicodeStrToAsciiStrS (String, Ip6Str, StringSize);\r
 \r
   Status = NetLibAsciiStrToIp6 (Ip6Str, Ip6Address);\r
 \r
@@ -3039,7 +3046,7 @@ NetLibStrToIp6 (
 \r
 /**\r
   Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length.\r
-  The format of the string is defined in RFC 4291 - Text Pepresentation of Addresses\r
+  The format of the string is defined in RFC 4291 - Text Representation of Addresses\r
   Prefixes: ipv6-address/prefix-length.\r
 \r
   @param[in]      String         The pointer to the Ascii string.\r
@@ -3060,6 +3067,7 @@ NetLibStrToIp6andPrefix (
   )\r
 {\r
   CHAR8                          *Ip6Str;\r
+  UINTN                          StringSize;\r
   CHAR8                          *PrefixStr;\r
   CHAR8                          *TempStr;\r
   EFI_STATUS                     Status;\r
@@ -3069,12 +3077,13 @@ NetLibStrToIp6andPrefix (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Ip6Str = (CHAR8 *) AllocatePool ((StrLen (String) + 1) * sizeof (CHAR8));\r
+  StringSize = StrLen (String) + 1;\r
+  Ip6Str = (CHAR8 *) AllocatePool (StringSize * sizeof (CHAR8));\r
   if (Ip6Str == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  UnicodeStrToAsciiStr (String, Ip6Str);\r
+  UnicodeStrToAsciiStrS (String, Ip6Str, StringSize);\r
 \r
   //\r
   // Get the sub string describing prefix length.\r
@@ -3115,7 +3124,7 @@ NetLibStrToIp6andPrefix (
     while (*PrefixStr != '\0') {\r
       if (NET_IS_DIGIT (*PrefixStr)) {\r
         Length = (UINT8) (Length * 10 + (*PrefixStr - '0'));\r
-        if (Length >= IP6_PREFIX_NUM) {\r
+        if (Length > IP6_PREFIX_MAX) {\r
           goto Exit;\r
         }\r
       } else {\r
@@ -3326,3 +3335,70 @@ NetLibGetSystemGuid (
   } while (Smbios.Raw < SmbiosEnd.Raw);\r
   return EFI_NOT_FOUND;\r
 }\r
+\r
+/**\r
+  Create Dns QName according the queried domain name. \r
+  QName is a domain name represented as a sequence of labels, \r
+  where each label consists of a length octet followed by that \r
+  number of octets. The QName terminates with the zero \r
+  length octet for the null label of the root. Caller should \r
+  take responsibility to free the buffer in returned pointer.\r
+\r
+  @param  DomainName    The pointer to the queried domain name string.  \r
+\r
+  @retval NULL          Failed to fill QName.\r
+  @return               QName filled successfully.\r
+  \r
+**/ \r
+CHAR8 *\r
+EFIAPI\r
+NetLibCreateDnsQName (\r
+  IN  CHAR16              *DomainName\r
+  )\r
+{\r
+  CHAR8                 *QueryName;\r
+  UINTN                 QueryNameSize;\r
+  CHAR8                 *Header;\r
+  CHAR8                 *Tail;\r
+  UINTN                 Len;\r
+  UINTN                 Index;\r
+\r
+  QueryName     = NULL;\r
+  QueryNameSize = 0;\r
+  Header        = NULL;\r
+  Tail          = NULL;\r
+\r
+  //\r
+  // One byte for first label length, one byte for terminated length zero. \r
+  //\r
+  QueryNameSize = StrLen (DomainName) + 2;\r
+  \r
+  if (QueryNameSize > DNS_MAX_NAME_SIZE) {\r
+    return NULL;\r
+  }\r
+\r
+  QueryName = AllocateZeroPool (QueryNameSize);\r
+  if (QueryName == NULL) {\r
+    return NULL;\r
+  }\r
+  \r
+  Header = QueryName;\r
+  Tail = Header + 1;\r
+  Len = 0;\r
+  for (Index = 0; DomainName[Index] != 0; Index++) {\r
+    *Tail = (CHAR8) DomainName[Index];\r
+    if (*Tail == '.') {\r
+      *Header = (CHAR8) Len;\r
+      Header = Tail;\r
+      Tail ++;\r
+      Len = 0;\r
+    } else {\r
+      Tail++;\r
+      Len++;\r
+    }\r
+  }\r
+  *Header = (CHAR8) Len;\r
+  *Tail = 0;\r
+\r
+  return QueryName;\r
+}\r