mirror of https://github.com/acidanthera/audk.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 <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
This commit is contained in:
parent
b659408b93
commit
e91cc29dd7
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue