summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Library
diff options
context:
space:
mode:
authorZhang Lubo <lubo.zhang@intel.com>2015-11-09 03:45:23 +0000
committerluobozhang <luobozhang@Edk2>2015-11-09 03:45:23 +0000
commite91cc29dd71c9597dbf835b068e4d4d9b1ccb97d (patch)
treee22616df7939d9feb47729ff9fc30a3588815f81 /MdeModulePkg/Library
parentb659408b933f40765960e877de3e1f8ceaab52cb (diff)
downloadedk2-e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d.zip
edk2-e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d.tar.gz
edk2-e91cc29dd71c9597dbf835b068e4d4d9b1ccb97d.tar.bz2
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')
-rw-r--r--MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
index aeb52d0..500b3c7 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;