/** @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
{\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
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
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
)\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
)\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
)\r
{\r
CHAR8 *Ip6Str;\r
+ UINTN StringSize;\r
CHAR8 *PrefixStr;\r
CHAR8 *TempStr;\r
EFI_STATUS Status;\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
//\r
// Get the sub string describing prefix length.\r
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
} 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
+}
\ No newline at end of file