]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.
authorZhang Lubo <lubo.zhang@intel.com>
Mon, 9 Nov 2015 03:45:23 +0000 (03:45 +0000)
committerluobozhang <luobozhang@Edk2>
Mon, 9 Nov 2015 03:45:23 +0000 (03:45 +0000)
When parsing the authority component of the input URL, it can not distinguish
the ":" is the flag that indicates the port or the separator between
the ipv6 address.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <lubo.zhang@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-by: Gary Ching-Pang Lin <glin@suse.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18744 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c

index aeb52d0088578bcabf9f2cd952271cd944f949ce..500b3c72b38f00721b5608238646ed2bd37c9552 100644 (file)
@@ -70,6 +70,7 @@ typedef enum {
   UrlParserUserInfo,\r
   UrlParserHostStart,     // "@"\r
   UrlParserHost,\r
+  UrlParserHostIpv6,      // "["(Ipv6 address) "]"\r
   UrlParserPortStart,     // ":"\r
   UrlParserPort,\r
   UrlParserStateMax\r
@@ -138,13 +139,16 @@ UriPercentDecode (
 \r
   @param[in]       Char           Next character.\r
   @param[in]       State          Current value of the parser state machine.\r
+  @param[in]       IsRightBracket TRUE if there is an sign ']' in the authority component and \r
+                                  indicates the next part is ':' before Port.                                \r
 \r
   @return          Updated state value.\r
 **/\r
 HTTP_URL_PARSE_STATE\r
 NetHttpParseAuthorityChar (\r
   IN  CHAR8                  Char,\r
-  IN  HTTP_URL_PARSE_STATE   State\r
+  IN  HTTP_URL_PARSE_STATE   State,\r
+  IN  BOOLEAN                *IsRightBracket\r
   )\r
 {\r
 \r
@@ -169,12 +173,27 @@ NetHttpParseAuthorityChar (
     break;\r
 \r
   case UrlParserHost:\r
-  case UrlParserHostStart:\r
+  case UrlParserHostStart:  \r
+    if (Char == '[') {\r
+      return UrlParserHostIpv6;\r
+    }\r
+    \r
     if (Char == ':') {\r
       return UrlParserPortStart;\r
     }\r
+    \r
     return UrlParserHost;\r
-\r
+    \r
+  case UrlParserHostIpv6:  \r
+    if (Char == ']') {\r
+      *IsRightBracket = TRUE;\r
+    }\r
+    \r
+    if (Char == ':' && *IsRightBracket == TRUE) {\r
+      return UrlParserPortStart;\r
+    }\r
+    return UrlParserHostIpv6;\r
+    \r
   case UrlParserPort:\r
   case UrlParserPortStart:\r
     return UrlParserPort;\r
@@ -210,6 +229,7 @@ NetHttpParseAuthority (
   HTTP_URL_PARSE_STATE  State;\r
   UINT32                Field;\r
   UINT32                OldField;\r
+  BOOLEAN               IsrightBracket;\r
   \r
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);\r
 \r
@@ -222,12 +242,13 @@ NetHttpParseAuthority (
     State = UrlParserHost;\r
   }\r
 \r
+  IsrightBracket = FALSE;\r
   Field = HTTP_URI_FIELD_MAX;\r
   OldField = Field;\r
   Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset;\r
   Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length;\r
   for (Char = Authority; Char < Authority + Length; Char++) {\r
-    State = NetHttpParseAuthorityChar (*Char, State);\r
+    State = NetHttpParseAuthorityChar (*Char, State, &IsrightBracket);\r
     switch (State) {\r
     case UrlParserStateMax:\r
       return EFI_INVALID_PARAMETER;\r
@@ -243,6 +264,10 @@ NetHttpParseAuthority (
     case UrlParserHost:\r
       Field = HTTP_URI_FIELD_HOST;\r
       break;\r
+\r
+    case UrlParserHostIpv6:\r
+      Field = HTTP_URI_FIELD_HOST;\r
+      break;\r
       \r
     case UrlParserPort:\r
       Field = HTTP_URI_FIELD_PORT;\r