]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
MdeModulePkg/CapsuleLib: Follow UEFI 22.2.3 to process FMP.
[mirror_edk2.git] / MdeModulePkg / Library / DxeNetLib / DxeNetLib.c
index 4acd0fad2c4dd2f884284a6cf50d81ec5c1be4f9..0a7117cf9d2e26627886bf5ee611664750bb343c 100644 (file)
@@ -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
@@ -580,6 +580,11 @@ NetGetMaskLength (
   Return the class of the IP address, such as class A, B, C.\r
   Addr is in host byte order.\r
 \r
+  [ATTENTION]\r
+  Classful addressing (IP class A/B/C) has been deprecated according to RFC4632.\r
+  Caller of this function could only check the returned value against\r
+  IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now.\r
+\r
   The address of class A  starts with 0.\r
   If the address belong to class A, return IP4_ADDR_CLASSA.\r
   The address of class B  starts with 10.\r
@@ -628,11 +633,10 @@ NetGetIpClass (
 \r
 /**\r
   Check whether the IP is a valid unicast address according to\r
-  the netmask. If NetMask is zero, use the IP address's class to get the default mask.\r
+  the netmask. \r
 \r
-  If Ip is 0, IP is not a valid unicast address.\r
-  Class D address is used for multicasting and class E address is reserved for future. If Ip\r
-  belongs to class D or class E, IP is not a valid unicast address.\r
+  ASSERT if NetMask is zero.\r
+  \r
   If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address.\r
 \r
   @param[in]  Ip                    The IP to check against.\r
@@ -648,18 +652,12 @@ NetIp4IsUnicast (
   IN IP4_ADDR               NetMask\r
   )\r
 {\r
-  INTN                      Class;\r
-\r
-  Class = NetGetIpClass (Ip);\r
-\r
-  if ((Ip == 0) || (Class >= IP4_ADDR_CLASSD)) {\r
+  ASSERT (NetMask != 0);\r
+  \r
+  if (Ip == 0 || IP4_IS_LOCAL_BROADCAST (Ip)) {\r
     return FALSE;\r
   }\r
-\r
-  if (NetMask == 0) {\r
-    NetMask = gIp4AllMasks[Class << 3];\r
-  }\r
-\r
+  \r
   if (((Ip &~NetMask) == ~NetMask) || ((Ip &~NetMask) == 0)) {\r
     return FALSE;\r
   }\r
@@ -1151,7 +1149,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 +1634,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 +2724,17 @@ NetLibAsciiStrToIp4 (
     TempStr = Ip4Str;\r
 \r
     while ((*Ip4Str != '\0') && (*Ip4Str != '.')) {\r
+      if (Index != 3 && !NET_IS_DIGIT (*Ip4Str)) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      \r
+      //\r
+      // Allow the IPv4 with prefix case, e.g. 192.168.10.10/24 \r
+      //\r
+      if (Index == 3 && !NET_IS_DIGIT (*Ip4Str) && *Ip4Str != '/') {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      \r
       Ip4Str++;\r
     }\r
 \r
@@ -2762,7 +2771,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
@@ -2823,6 +2832,17 @@ NetLibAsciiStrToIp6 (
     TempStr = Ip6Str;\r
 \r
     while ((*Ip6Str != '\0') && (*Ip6Str != ':')) {\r
+      if (Index != 14 && !NET_IS_HEX (*Ip6Str)) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      \r
+      //\r
+      // Allow the IPv6 with prefix case, e.g. 2000:aaaa::10/24 \r
+      //\r
+      if (Index == 14 && !NET_IS_HEX (*Ip6Str) && *Ip6Str != '/') {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      \r
       Ip6Str++;\r
     }\r
 \r
@@ -2976,18 +2996,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 +3021,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 +3039,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 +3063,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 +3084,7 @@ NetLibStrToIp6andPrefix (
   )\r
 {\r
   CHAR8                          *Ip6Str;\r
+  UINTN                          StringSize;\r
   CHAR8                          *PrefixStr;\r
   CHAR8                          *TempStr;\r
   EFI_STATUS                     Status;\r
@@ -3069,12 +3094,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
@@ -3392,4 +3418,4 @@ NetLibCreateDnsQName (
   *Tail = 0;\r
 \r
   return QueryName;\r
-}
\ No newline at end of file
+}\r