Revision: 18744
          http://sourceforge.net/p/edk2/code/18744
Author:   luobozhang
Date:     2015-11-09 03:45:23 +0000 (Mon, 09 Nov 2015)
Log Message:
-----------
MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

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 <[email protected]>
Reviewed-by: Fu Siyuan <[email protected]>
Reviewed-by: Wu Jiaxin <[email protected]>
Reviewed-by: Gary Ching-Pang Lin <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c

Modified: trunk/edk2/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
===================================================================
--- trunk/edk2/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c     2015-11-09 
03:30:42 UTC (rev 18743)
+++ trunk/edk2/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c     2015-11-09 
03:45:23 UTC (rev 18744)
@@ -70,6 +70,7 @@
   UrlParserUserInfo,
   UrlParserHostStart,     // "@"
   UrlParserHost,
+  UrlParserHostIpv6,      // "["(Ipv6 address) "]"
   UrlParserPortStart,     // ":"
   UrlParserPort,
   UrlParserStateMax
@@ -138,13 +139,16 @@
 
   @param[in]       Char           Next character.
   @param[in]       State          Current value of the parser state machine.
+  @param[in]       IsRightBracket TRUE if there is an sign ']' in the 
authority component and 
+                                  indicates the next part is ':' before Port.  
                              
 
   @return          Updated state value.
 **/
 HTTP_URL_PARSE_STATE
 NetHttpParseAuthorityChar (
   IN  CHAR8                  Char,
-  IN  HTTP_URL_PARSE_STATE   State
+  IN  HTTP_URL_PARSE_STATE   State,
+  IN  BOOLEAN                *IsRightBracket
   )
 {
 
@@ -169,12 +173,27 @@
     break;
 
   case UrlParserHost:
-  case UrlParserHostStart:
+  case UrlParserHostStart:  
+    if (Char == '[') {
+      return UrlParserHostIpv6;
+    }
+    
     if (Char == ':') {
       return UrlParserPortStart;
     }
+    
     return UrlParserHost;
-
+    
+  case UrlParserHostIpv6:  
+    if (Char == ']') {
+      *IsRightBracket = TRUE;
+    }
+    
+    if (Char == ':' && *IsRightBracket == TRUE) {
+      return UrlParserPortStart;
+    }
+    return UrlParserHostIpv6;
+    
   case UrlParserPort:
   case UrlParserPortStart:
     return UrlParserPort;
@@ -210,6 +229,7 @@
   HTTP_URL_PARSE_STATE  State;
   UINT32                Field;
   UINT32                OldField;
+  BOOLEAN               IsrightBracket;
   
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
 
@@ -222,12 +242,13 @@
     State = UrlParserHost;
   }
 
+  IsrightBracket = FALSE;
   Field = HTTP_URI_FIELD_MAX;
   OldField = Field;
   Authority = Url + UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Offset;
   Length = UrlParser->FieldData[HTTP_URI_FIELD_AUTHORITY].Length;
   for (Char = Authority; Char < Authority + Length; Char++) {
-    State = NetHttpParseAuthorityChar (*Char, State);
+    State = NetHttpParseAuthorityChar (*Char, State, &IsrightBracket);
     switch (State) {
     case UrlParserStateMax:
       return EFI_INVALID_PARAMETER;
@@ -243,6 +264,10 @@
     case UrlParserHost:
       Field = HTTP_URI_FIELD_HOST;
       break;
+
+    case UrlParserHostIpv6:
+      Field = HTTP_URI_FIELD_HOST;
+      break;
       
     case UrlParserPort:
       Field = HTTP_URI_FIELD_PORT;


------------------------------------------------------------------------------
Presto, an open source distributed SQL query engine for big data, initially
developed by Facebook, enables you to easily query your data on Hadoop in a 
more interactive manner. Teradata is also now providing full enterprise
support for Presto. Download a free open source copy now.
http://pubads.g.doubleclick.net/gampad/clk?id=250295911&iu=/4140
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to