Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

2015-11-08 Thread Wu, Jiaxin
The patch looks good to me.

Reviewed-by: Wu Jiaxin 


-Original Message-
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Zhang 
Lubo
Sent: Friday, November 6, 2015 4:12 PM
To: edk2-devel@lists.01.org
Cc: Ye, Ting; Fu, Siyuan; Wu, Jiaxin; Gary Ching-Pang Lin
Subject: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 
address correctly.

v2:
*Add a Url Parse state machine to indicate the host is ipv6 expressed url and 
can parse the ipv6 address correctly.

Cc: Fu Siyuan 
Cc: Ye Ting 
CC: Wu Jiaxin 
CC: Gary Ching-Pang Lin 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo 
---
 MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 
 1 file 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
@@ -68,10 +68,11 @@ typedef enum {
   UrlParserFragmentStart, // "#"
   UrlParserFragment,
   UrlParserUserInfo,
   UrlParserHostStart, // "@"
   UrlParserHost,
+  UrlParserHostIpv6,  // "["(Ipv6 address) "]"
   UrlParserPortStart, // ":"
   UrlParserPort,
   UrlParserStateMax
 } HTTP_URL_PARSE_STATE;
 
@@ -136,17 +137,20 @@ UriPercentDecode (
   This function return the updated state accroding to the input state and next 
character of
   the authority.
 
   @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
   )
 {
 
   //
   // RFC 3986:
@@ -167,16 +171,31 @@ NetHttpParseAuthorityChar (
   return UrlParserHostStart;
 }
 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;
 
   default:
@@ -208,10 +227,11 @@ NetHttpParseAuthority (
   CHAR8 *Authority;
   UINT32Length;
   HTTP_URL_PARSE_STATE  State;
   UINT32Field;
   UINT32OldField;
+  BOOLEAN   IsrightBracket;
   
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
 
   //
   // authority   = [ userinfo "@" ] host [ ":" port ]
@@ -220,16 +240,17 @@ NetHttpParseAuthority (
 State = UrlParserUserInfo;
   } else {
 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, );
 switch (State) {
 case UrlParserStateMax:
   return EFI_INVALID_PARAMETER;
 
 case UrlParserHostStart:
@@ -241,10 +262,14 @@ NetHttpParseAuthority (
   break;
   
 case UrlParserHost:
   Field = HTTP_URI_FIELD_HOST;
   break;
+
+case UrlParserHostIpv6:
+  Field = HTTP_URI_FIELD_HOST;
+  break;
   
 case UrlParserPort:
   Field = HTTP_URI_FIELD_PORT;
   break;
 
--
1.9.5.msysgit.1

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


[edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

2015-11-06 Thread Zhang Lubo
v2:
*Add a Url Parse state machine to indicate the host is ipv6 expressed url and 
can parse
the ipv6 address correctly.

Cc: Fu Siyuan 
Cc: Ye Ting 
CC: Wu Jiaxin 
CC: Gary Ching-Pang Lin 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo 
---
 MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 
 1 file 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
@@ -68,10 +68,11 @@ typedef enum {
   UrlParserFragmentStart, // "#"
   UrlParserFragment,
   UrlParserUserInfo,
   UrlParserHostStart, // "@"
   UrlParserHost,
+  UrlParserHostIpv6,  // "["(Ipv6 address) "]"
   UrlParserPortStart, // ":"
   UrlParserPort,
   UrlParserStateMax
 } HTTP_URL_PARSE_STATE;
 
@@ -136,17 +137,20 @@ UriPercentDecode (
   This function return the updated state accroding to the input state and next 
character of
   the authority.
 
   @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
   )
 {
 
   //
   // RFC 3986:
@@ -167,16 +171,31 @@ NetHttpParseAuthorityChar (
   return UrlParserHostStart;
 }
 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;
 
   default:
@@ -208,10 +227,11 @@ NetHttpParseAuthority (
   CHAR8 *Authority;
   UINT32Length;
   HTTP_URL_PARSE_STATE  State;
   UINT32Field;
   UINT32OldField;
+  BOOLEAN   IsrightBracket;
   
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
 
   //
   // authority   = [ userinfo "@" ] host [ ":" port ]
@@ -220,16 +240,17 @@ NetHttpParseAuthority (
 State = UrlParserUserInfo;
   } else {
 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, );
 switch (State) {
 case UrlParserStateMax:
   return EFI_INVALID_PARAMETER;
 
 case UrlParserHostStart:
@@ -241,10 +262,14 @@ NetHttpParseAuthority (
   break;
   
 case UrlParserHost:
   Field = HTTP_URI_FIELD_HOST;
   break;
+
+case UrlParserHostIpv6:
+  Field = HTTP_URI_FIELD_HOST;
+  break;
   
 case UrlParserPort:
   Field = HTTP_URI_FIELD_PORT;
   break;
 
-- 
1.9.5.msysgit.1

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

2015-11-06 Thread Gary Ching-Pang Lin
On Fri, Nov 06, 2015 at 04:11:45PM +0800, Zhang Lubo wrote:
> v2:
> *Add a Url Parse state machine to indicate the host is ipv6 expressed url and 
> can parse
> the ipv6 address correctly.
> 
This patch works for me. The IPv6 address was extracted from my url.

Tested-by: Gary Ching-Pang Lin 

> Cc: Fu Siyuan 
> Cc: Ye Ting 
> CC: Wu Jiaxin 
> CC: Gary Ching-Pang Lin 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Zhang Lubo 
> ---
>  MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 33 
> 
>  1 file 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
> @@ -68,10 +68,11 @@ typedef enum {
>UrlParserFragmentStart, // "#"
>UrlParserFragment,
>UrlParserUserInfo,
>UrlParserHostStart, // "@"
>UrlParserHost,
> +  UrlParserHostIpv6,  // "["(Ipv6 address) "]"
>UrlParserPortStart, // ":"
>UrlParserPort,
>UrlParserStateMax
>  } HTTP_URL_PARSE_STATE;
>  
> @@ -136,17 +137,20 @@ UriPercentDecode (
>This function return the updated state accroding to the input state and 
> next character of
>the authority.
>  
>@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
>)
>  {
>  
>//
>// RFC 3986:
> @@ -167,16 +171,31 @@ NetHttpParseAuthorityChar (
>return UrlParserHostStart;
>  }
>  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;
>  
>default:
> @@ -208,10 +227,11 @@ NetHttpParseAuthority (
>CHAR8 *Authority;
>UINT32Length;
>HTTP_URL_PARSE_STATE  State;
>UINT32Field;
>UINT32OldField;
> +  BOOLEAN   IsrightBracket;
>
>ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
>  
>//
>// authority   = [ userinfo "@" ] host [ ":" port ]
> @@ -220,16 +240,17 @@ NetHttpParseAuthority (
>  State = UrlParserUserInfo;
>} else {
>  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, );
>  switch (State) {
>  case UrlParserStateMax:
>return EFI_INVALID_PARAMETER;
>  
>  case UrlParserHostStart:
> @@ -241,10 +262,14 @@ NetHttpParseAuthority (
>break;
>
>  case UrlParserHost:
>Field = HTTP_URI_FIELD_HOST;
>break;
> +
> +case UrlParserHostIpv6:
> +  Field = HTTP_URI_FIELD_HOST;
> +  break;
>
>  case UrlParserPort:
>Field = HTTP_URI_FIELD_PORT;
>break;
>  
> -- 
> 1.9.5.msysgit.1
> 
> ___
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
> 
___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

2015-11-05 Thread Zhang, Lubo
Yes , you are right, I will make some changes.
Thanks 

-Original Message-
From: Fu, Siyuan 
Sent: Friday, November 06, 2015 10:02 AM
To: Zhang, Lubo; edk2-devel@lists.01.org
Cc: Ye, Ting; Wu, Jiaxin; Gary Ching-Pang Lin
Subject: RE: [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 
address correctly.

Hi, Lubo

The patch pass "IsBracket" by value so it will always be FALSE, please check it.

Siyuan

-Original Message-
From: Zhang, Lubo 
Sent: Friday, November 6, 2015 9:31 AM
To: edk2-devel@lists.01.org
Cc: Fu, Siyuan ; Ye, Ting ; Wu, Jiaxin 
; Gary Ching-Pang Lin 
Subject: [patch] 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.

Cc: Fu Siyuan 
Cc: Ye Ting 
CC: Wu Jiaxin 
CC: Gary Ching-Pang Lin 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo 
---
 MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c 
b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
index aeb52d0..8c3e4fe 100644
--- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
+++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
@@ -136,17 +136,20 @@ UriPercentDecode (
   This function return the updated state accroding to the input state and next 
character of
   the authority.
 
   @param[in]   Char   Next character.
   @param[in]   State  Current value of the parser state machine.
+  @param[in]   IsBracket  TRUE if there is an sign '[' in the 
authority component and 
+  indicates the next part is Ipv6 address.
 
   @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  BOOLEANIsBracket
   )
 {
 
   //
   // RFC 3986:
@@ -167,18 +170,26 @@ NetHttpParseAuthorityChar (
   return UrlParserHostStart;
 }
 break;
 
   case UrlParserHost:
-  case UrlParserHostStart:
-if (Char == ':') {
+  case UrlParserHostStart:  
+if (Char == '[') {
+  IsBracket = TRUE;
+}
+
+if (Char == ']' || (IsBracket == FALSE && Char == ':')) {
   return UrlParserPortStart;
 }
+
 return UrlParserHost;
 
   case UrlParserPort:
   case UrlParserPortStart:
+if (Char == ':') {
+  return UrlParserPortStart;
+}
 return UrlParserPort;
 
   default:
 break;
   }
@@ -208,10 +219,11 @@ NetHttpParseAuthority (
   CHAR8 *Authority;
   UINT32Length;
   HTTP_URL_PARSE_STATE  State;
   UINT32Field;
   UINT32OldField;
+  BOOLEAN   IsBracket;
   
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
 
   //
   // authority   = [ userinfo "@" ] host [ ":" port ]
@@ -220,16 +232,17 @@ NetHttpParseAuthority (
 State = UrlParserUserInfo;
   } else {
 State = UrlParserHost;
   }
 
+  IsBracket = 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, IsBracket);
 switch (State) {
 case UrlParserStateMax:
   return EFI_INVALID_PARAMETER;
 
 case UrlParserHostStart:
@@ -672,22 +685,22 @@ HttpUrlGetIp6 (
   if (Length < 2) {
 return EFI_INVALID_PARAMETER;
   }
 
   Ptr= Url + Parser->FieldData[HTTP_URI_FIELD_HOST].Offset;
-  if ((Ptr[0] != '[') || (Ptr[Length - 1] != ']')) {
+  if ((Ptr[0] != '[') || (Ptr[Length] != ']')) {
 return EFI_INVALID_PARAMETER;
   }
 
   Ip6String = AllocatePool (Length);
   if (Ip6String == NULL) {
 return EFI_OUT_OF_RESOURCES;
   }
   
   Status = UriPercentDecode (
  Ptr + 1,
- Length - 2,
+ Length - 1,
  Ip6String,
  
  );
   if (EFI_ERROR (Status)) {
 return Status;
--
1.9.5.msysgit.1

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


[edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

2015-11-05 Thread Zhang Lubo
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.

Cc: Fu Siyuan 
Cc: Ye Ting 
CC: Wu Jiaxin 
CC: Gary Ching-Pang Lin 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo 
---
 MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c 
b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
index aeb52d0..8c3e4fe 100644
--- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
+++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
@@ -136,17 +136,20 @@ UriPercentDecode (
   This function return the updated state accroding to the input state and next 
character of
   the authority.
 
   @param[in]   Char   Next character.
   @param[in]   State  Current value of the parser state machine.
+  @param[in]   IsBracket  TRUE if there is an sign '[' in the 
authority component and 
+  indicates the next part is Ipv6 address.
 
   @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  BOOLEANIsBracket
   )
 {
 
   //
   // RFC 3986:
@@ -167,18 +170,26 @@ NetHttpParseAuthorityChar (
   return UrlParserHostStart;
 }
 break;
 
   case UrlParserHost:
-  case UrlParserHostStart:
-if (Char == ':') {
+  case UrlParserHostStart:  
+if (Char == '[') {
+  IsBracket = TRUE;
+}
+
+if (Char == ']' || (IsBracket == FALSE && Char == ':')) {
   return UrlParserPortStart;
 }
+
 return UrlParserHost;
 
   case UrlParserPort:
   case UrlParserPortStart:
+if (Char == ':') {
+  return UrlParserPortStart;
+}
 return UrlParserPort;
 
   default:
 break;
   }
@@ -208,10 +219,11 @@ NetHttpParseAuthority (
   CHAR8 *Authority;
   UINT32Length;
   HTTP_URL_PARSE_STATE  State;
   UINT32Field;
   UINT32OldField;
+  BOOLEAN   IsBracket;
   
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
 
   //
   // authority   = [ userinfo "@" ] host [ ":" port ]
@@ -220,16 +232,17 @@ NetHttpParseAuthority (
 State = UrlParserUserInfo;
   } else {
 State = UrlParserHost;
   }
 
+  IsBracket = 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, IsBracket);
 switch (State) {
 case UrlParserStateMax:
   return EFI_INVALID_PARAMETER;
 
 case UrlParserHostStart:
@@ -672,22 +685,22 @@ HttpUrlGetIp6 (
   if (Length < 2) {
 return EFI_INVALID_PARAMETER;
   }
 
   Ptr= Url + Parser->FieldData[HTTP_URI_FIELD_HOST].Offset;
-  if ((Ptr[0] != '[') || (Ptr[Length - 1] != ']')) {
+  if ((Ptr[0] != '[') || (Ptr[Length] != ']')) {
 return EFI_INVALID_PARAMETER;
   }
 
   Ip6String = AllocatePool (Length);
   if (Ip6String == NULL) {
 return EFI_OUT_OF_RESOURCES;
   }
   
   Status = UriPercentDecode (
  Ptr + 1,
- Length - 2,
+ Length - 1,
  Ip6String,
  
  );
   if (EFI_ERROR (Status)) {
 return Status;
-- 
1.9.5.msysgit.1

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


Re: [edk2] [patch] MdeModulePkg:Fix a bug that HttpLib can not parse Ipv6 address correctly.

2015-11-05 Thread Fu, Siyuan
Hi, Lubo

The patch pass "IsBracket" by value so it will always be FALSE, please check it.

Siyuan

-Original Message-
From: Zhang, Lubo 
Sent: Friday, November 6, 2015 9:31 AM
To: edk2-devel@lists.01.org
Cc: Fu, Siyuan ; Ye, Ting ; Wu, Jiaxin 
; Gary Ching-Pang Lin 
Subject: [patch] 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.

Cc: Fu Siyuan 
Cc: Ye Ting 
CC: Wu Jiaxin 
CC: Gary Ching-Pang Lin 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo 
---
 MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c 
b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
index aeb52d0..8c3e4fe 100644
--- a/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
+++ b/MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.c
@@ -136,17 +136,20 @@ UriPercentDecode (
   This function return the updated state accroding to the input state and next 
character of
   the authority.
 
   @param[in]   Char   Next character.
   @param[in]   State  Current value of the parser state machine.
+  @param[in]   IsBracket  TRUE if there is an sign '[' in the 
authority component and 
+  indicates the next part is Ipv6 address.
 
   @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  BOOLEANIsBracket
   )
 {
 
   //
   // RFC 3986:
@@ -167,18 +170,26 @@ NetHttpParseAuthorityChar (
   return UrlParserHostStart;
 }
 break;
 
   case UrlParserHost:
-  case UrlParserHostStart:
-if (Char == ':') {
+  case UrlParserHostStart:  
+if (Char == '[') {
+  IsBracket = TRUE;
+}
+
+if (Char == ']' || (IsBracket == FALSE && Char == ':')) {
   return UrlParserPortStart;
 }
+
 return UrlParserHost;
 
   case UrlParserPort:
   case UrlParserPortStart:
+if (Char == ':') {
+  return UrlParserPortStart;
+}
 return UrlParserPort;
 
   default:
 break;
   }
@@ -208,10 +219,11 @@ NetHttpParseAuthority (
   CHAR8 *Authority;
   UINT32Length;
   HTTP_URL_PARSE_STATE  State;
   UINT32Field;
   UINT32OldField;
+  BOOLEAN   IsBracket;
   
   ASSERT ((UrlParser->FieldBitMap & BIT (HTTP_URI_FIELD_AUTHORITY)) != 0);
 
   //
   // authority   = [ userinfo "@" ] host [ ":" port ]
@@ -220,16 +232,17 @@ NetHttpParseAuthority (
 State = UrlParserUserInfo;
   } else {
 State = UrlParserHost;
   }
 
+  IsBracket = 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, IsBracket);
 switch (State) {
 case UrlParserStateMax:
   return EFI_INVALID_PARAMETER;
 
 case UrlParserHostStart:
@@ -672,22 +685,22 @@ HttpUrlGetIp6 (
   if (Length < 2) {
 return EFI_INVALID_PARAMETER;
   }
 
   Ptr= Url + Parser->FieldData[HTTP_URI_FIELD_HOST].Offset;
-  if ((Ptr[0] != '[') || (Ptr[Length - 1] != ']')) {
+  if ((Ptr[0] != '[') || (Ptr[Length] != ']')) {
 return EFI_INVALID_PARAMETER;
   }
 
   Ip6String = AllocatePool (Length);
   if (Ip6String == NULL) {
 return EFI_OUT_OF_RESOURCES;
   }
   
   Status = UriPercentDecode (
  Ptr + 1,
- Length - 2,
+ Length - 1,
  Ip6String,
  
  );
   if (EFI_ERROR (Status)) {
 return Status;
--
1.9.5.msysgit.1

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel