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