From: Zhang Lubo Date: Mon, 9 Nov 2015 03:45:23 +0000 (+0000) Subject: MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly. X-Git-Tag: edk2-stable201903~8621 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d;hp=b659408b933f40765960e877de3e1f8ceaab52cb;p=mirror_edk2.git 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 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/trunk/edk2@18744 6f19259b-4bc3-4df7-8a09-765794883524 --- 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;