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