diff options
author | Zhang Lubo <lubo.zhang@intel.com> | 2015-11-09 03:45:23 +0000 |
---|---|---|
committer | luobozhang <luobozhang@Edk2> | 2015-11-09 03:45:23 +0000 |
commit | e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d (patch) | |
tree | e22616df7939d9feb47729ff9fc30a3588815f81 /MdeModulePkg/Library/DxeHttpLib | |
parent | b659408b933f40765960e877de3e1f8ceaab52cb (diff) | |
download | edk2-e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d.tar.gz edk2-e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d.tar.bz2 edk2-e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d.zip |
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 <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
Diffstat (limited to 'MdeModulePkg/Library/DxeHttpLib')
-rw-r--r-- | MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c index aeb52d0088..500b3c72b3 100644 --- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c +++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c @@ -70,6 +70,7 @@ typedef enum { UrlParserUserInfo,
UrlParserHostStart, // "@"
UrlParserHost,
+ UrlParserHostIpv6, // "["(Ipv6 address) "]"
UrlParserPortStart, // ":"
UrlParserPort,
UrlParserStateMax
@@ -138,13 +139,16 @@ UriPercentDecode ( @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 @@ NetHttpParseAuthorityChar ( 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 @@ NetHttpParseAuthority ( HTTP_URL_PARSE_STATE State;
UINT32 Field;
UINT32 OldField;
+ BOOLEAN IsrightBracket;
ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
@@ -222,12 +242,13 @@ NetHttpParseAuthority ( 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 @@ NetHttpParseAuthority ( case UrlParserHost:
Field = HTTP_URI_FIELD_HOST;
break;
+
+ case UrlParserHostIpv6:
+ Field = HTTP_URI_FIELD_HOST;
+ break;
case UrlParserPort:
Field = HTTP_URI_FIELD_PORT;
|