Revision: 18875
          http://sourceforge.net/p/edk2/code/18875
Author:   vanjeff
Date:     2015-11-18 08:37:41 +0000 (Wed, 18 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.

(Sync patch r18744 from main trunk.)

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]>

Revision Links:
--------------
    http://sourceforge.net/p/edk2/code/18744

Modified Paths:
--------------
    branches/UDK2015/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c

Modified: branches/UDK2015/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
===================================================================
--- branches/UDK2015/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c       
2015-11-18 08:36:42 UTC (rev 18874)
+++ branches/UDK2015/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c       
2015-11-18 08:37:41 UTC (rev 18875)
@@ -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;


------------------------------------------------------------------------------
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to