From 234dee51b1e1d7e42143b0a93832eccaced455ea Mon Sep 17 00:00:00 2001 From: Zhang Lubo Date: Wed, 18 Nov 2015 08:37:41 +0000 Subject: 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 Reviewed-by: Fu Siyuan Reviewed-by: Wu Jiaxin Reviewed-by: Gary Ching-Pang Lin git-svn-id: https://svn.code.sf.net/p/edk2/code/branches/UDK2015@18875 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 ++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'MdeModulePkg/Library') 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; -- cgit v1.2.3