[PATCH] Decodes struct uri.{user=2Cpassword} members.

gL2n30Y06arv2 gL2n30Y06arv2 at hotmail.com
Wed Oct 21 13:29:35 EDT 2009


Replaces the encoded user info (user:password)=2C that was kept in struct
uri=2C with its decoded counterpart.=A0 The decoded version is expected to
be much more useful.=A0 It also attempts to amend the other parts of the
project appropriately.
The reference is section 3.2 of RFC 3986.

Signed-off-by: gL2n30Y06arv2 <gL2n30Y06arv2 at hotmail.com>
---
=A0src/core/uri.c=A0=A0=A0=A0=A0=A0=A0=A0 |=A0=A0 45 ++++++++++++++++++++++=
++++++-----------------
=A0src/include/gpxe/uri.h |=A0=A0=A0 4 ++--
=A0src/net/tcp/ftp.c=A0=A0=A0=A0=A0 |=A0=A0 28 ++++++++++++++++++++++++++--
=A0src/net/tcp/http.c=A0=A0=A0=A0 |=A0=A0 17 ++---------------
=A0src/tests/uri_test.c=A0=A0 |=A0=A0=A0 7 +++++++
=A05 files changed=2C 65 insertions(+)=2C 36 deletions(-)

diff --git a/src/core/uri.c b/src/core/uri.c
index 50a96d3..63166e5 100644
--- a/src/core/uri.c
+++ b/src/core/uri.c
@@ -45=2C9 +45=2C9 @@ static void dump_uri ( struct uri *uri ) {
=A0=A0=A0=A0 if ( uri->opaque )
=A0=A0=A0=A0 =A0=A0=A0 DBG ( " opaque \"%s\""=2C uri->opaque )=3B
=A0=A0=A0=A0 if ( uri->user )
-=A0=A0=A0 =A0=A0=A0 DBG ( " user \"%s\""=2C uri->user )=3B
+=A0=A0=A0 =A0=A0=A0 DBG ( " decoded user \"%s\""=2C uri->user )=3B
=A0=A0=A0=A0 if ( uri->password )
-=A0=A0=A0 =A0=A0=A0 DBG ( " password \"%s\""=2C uri->password )=3B
+=A0=A0=A0 =A0=A0=A0 DBG ( " decoded password \"%s\""=2C uri->password )=3B
=A0=A0=A0=A0 if ( uri->host )
=A0=A0=A0=A0 =A0=A0=A0 DBG ( " host \"%s\""=2C uri->host )=3B
=A0=A0=A0=A0 if ( uri->port )
@@ -149=2C19 +149=2C25 @@ struct uri * parse_uri ( const char *uri_string )=
 {
=A0=A0=A0=A0 =A0=A0=A0 uri->path =3D path=3B
=A0=A0=A0=A0 }
=A0
-=A0=A0=A0 /* Split authority into user[:password] and host[:port] portions=
 */
+=A0=A0=A0 /* Split authority into user[:password] and host[:port]
+=A0=A0=A0 =A0=A0 portions.=A0 Decodes authority. */
=A0=A0=A0=A0 if ( ( tmp =3D strchr ( authority=2C '@' ) ) ) {
=A0=A0=A0=A0 =A0=A0=A0 /* Has user[:password] */
=A0=A0=A0=A0 =A0=A0=A0 *(tmp++) =3D '\0'=3B
=A0=A0=A0=A0 =A0=A0=A0 uri->host =3D tmp=3B
+=A0=A0=A0 =A0=A0=A0 uri_decode ( authority=2C authority /* in place */=2C=
=20
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 strlen ( authority ) + 1 /* NULL *=
/ )=3B
+=A0=A0=A0 =A0=A0=A0 /* assert ( uri->host>=3D ( authority +=20
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 strlen ( authority ) + 1=
 ) )=3B */
=A0=A0=A0=A0 =A0=A0=A0 uri->user =3D authority=3B
-=A0=A0=A0 =A0=A0=A0 if ( ( tmp =3D strchr ( authority=2C ':' ) ) ) {
+=A0=A0=A0 =A0=A0=A0 if ( ( tmp =3D strchr ( uri->user=2C ':' ) ) ) {
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /* Has password */
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 *(tmp++) =3D '\0'=3B
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 uri->password =3D tmp=3B
=A0=A0=A0=A0 =A0=A0=A0 }
+
=A0=A0=A0=A0 } else {
-=A0=A0=A0 =A0=A0=A0 /* No user:password */
+=A0=A0=A0 =A0=A0=A0 /* No user[:password] */
=A0=A0=A0=A0 =A0=A0=A0 uri->host =3D authority=3B
=A0=A0=A0=A0 }
=A0
@@ -229=2C13 +235=2C14 @@ int unparse_uri ( char *buf=2C size_t size=2C str=
uct uri *uri ) {
=A0=A0=A0=A0 /* [user[:password]@]host[:port] */
=A0=A0=A0=A0 if ( uri->host ) {
=A0=A0=A0=A0 =A0=A0=A0 if ( uri->user ) {
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 used +=3D uri_encode ( uri->user=2C ( buf + =
used )=2C
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0( size - us=
ed ) )=3B
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 used +=3D ssnprintf ( ( buf + used )=2C ( =
size - used )=2C
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 "%s"=2C uri->u=
ser )=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if ( uri->password ) {
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 used +=3D ssnprintf ( ( buf + used=
 )=2C
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ( si=
ze - used )=2C
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ":%s=
"=2C uri->password )=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 }
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ":" )=3B
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 if ( uri->password )=20
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 used +=3D uri_encode ( uri->passwo=
rd=2C
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ( bu=
f + used )=2C
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ( si=
ze - used ) )=3B
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 used +=3D ssnprintf ( ( buf + used )=2C ( =
size - used )=2C
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 "@" )=3B
=A0=A0=A0=A0 =A0=A0=A0 }
@@ -435=2C12 +442=2C14 @@ size_t uri_encode ( const char *raw_string=2C cha=
r *buf=2C size_t len ) {
=A0}
=A0
=A0/**
- * Decode URI-encoded string
+ * Decode URI-encoded string.
=A0 *
=A0 * @v encoded_string=A0=A0=A0 URI-encoded string
=A0 * @v buf=A0=A0=A0 =A0=A0=A0 Buffer to contain decoded string
=A0 * @v len=A0=A0=A0 =A0=A0=A0 Length of buffer
=A0 * @ret len=A0=A0=A0 =A0=A0=A0 Length of decoded string (excluding NUL)
+ *
+ * Can be used when encoded_string and buf overlap and in place.
=A0 */
=A0size_t uri_decode ( const char *encoded_string=2C char *buf=2C size_t le=
n ) {
=A0=A0=A0=A0 ssize_t remaining =3D len=3B
@@ -448=2C10 +457=2C8 @@ size_t uri_decode ( const char *encoded_string=2C =
char *buf=2C size_t len ) {
=A0=A0=A0=A0 char *hexbuf_end=3B
=A0=A0=A0=A0 unsigned char c=3B
=A0
-=A0=A0=A0 if ( len )
-=A0=A0=A0 =A0=A0=A0 buf[0] =3D '\0'=3B
-
-=A0=A0=A0 while ( *encoded_string ) {
+=A0=A0=A0 while ( *encoded_string=A0 &&=A0=20
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 remaining> 1 /* a NULL is essential */ ) {
=A0=A0=A0=A0 =A0=A0=A0 if ( *encoded_string =3D=3D '%' ) {
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 encoded_string++=3B
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 snprintf ( hexbuf=2C sizeof ( hexbuf )=2C =
"%s"=2C
@@ -461=2C7 +468=2C11 @@ size_t uri_decode ( const char *encoded_string=2C =
char *buf=2C size_t len ) {
=A0=A0=A0=A0 =A0=A0=A0 } else {
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 c =3D *(encoded_string++)=3B
=A0=A0=A0=A0 =A0=A0=A0 }
-=A0=A0=A0 =A0=A0=A0 ssnprintf ( buf++=2C remaining--=2C "%c"=2C c )=3B
+=A0=A0=A0 =A0=A0=A0 *(remaining--=2C buf++) =3D c=3B
=A0=A0=A0=A0 }
+
+=A0=A0=A0 if ( remaining )
+=A0=A0=A0 =A0=A0=A0 *buf =3D '\0'=3B
+
=A0=A0=A0=A0 return ( len - remaining )=3B
=A0}
diff --git a/src/include/gpxe/uri.h b/src/include/gpxe/uri.h
index 03c88d2..de8d5a9 100644
--- a/src/include/gpxe/uri.h
+++ b/src/include/gpxe/uri.h
@@ -47=2C9 +47=2C9 @@ struct uri {
=A0=A0=A0=A0 const char *scheme=3B
=A0=A0=A0=A0 /** Opaque part */
=A0=A0=A0=A0 const char *opaque=3B
-=A0=A0=A0 /** User name */
+=A0=A0=A0 /** Decoded user name */
=A0=A0=A0=A0 const char *user=3B
-=A0=A0=A0 /** Password */
+=A0=A0=A0 /** Decoded password */
=A0=A0=A0=A0 const char *password=3B
=A0=A0=A0=A0 /** Host name */
=A0=A0=A0=A0 const char *host=3B
diff --git a/src/net/tcp/ftp.c b/src/net/tcp/ftp.c
index 0719bf7..26103f6 100644
--- a/src/net/tcp/ftp.c
+++ b/src/net/tcp/ftp.c
@@ -131=2C11 +131=2C35 @@ static const char * ftp_uri_path ( struct ftp_req=
uest *ftp ) {
=A0=A0=A0=A0 return ftp->uri->path=3B
=A0}
=A0
+/**
+ * Retrieve FTP user
+ *
+ * @v ftp=A0=A0=A0 =A0=A0=A0 FTP request
+ * @ret user=A0=A0=A0 =A0=A0=A0 FTP user
+ */
+static const char * ftp_user ( struct ftp_request *ftp ) {
+=A0=A0=A0 static char *ftp_default_user =3D "anonymous"=3B
+=A0=A0=A0 return ftp->uri->user ? ftp->uri->user : ftp_default_user=3B
+}
+
+/**
+ * Retrieve FTP password
+ *
+ * @v ftp=A0=A0=A0 =A0=A0=A0 FTP request
+ * @ret password=A0=A0=A0 FTP password
+ */
+static const char * ftp_password ( struct ftp_request *ftp ) {
+=A0=A0=A0 static char *ftp_default_password =3D=20
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 "etherboot at etherboot.org=
"=3B
+=A0=A0=A0 return ftp->uri->password ?=20
+=A0=A0=A0 =A0=A0=A0 ftp->uri->password : ftp_default_password=3B
+}
+
=A0/** FTP control channel strings */
=A0static struct ftp_control_string ftp_strings[] =3D {
=A0=A0=A0=A0 [FTP_CONNECT]=A0=A0=A0 =3D { NULL=2C NULL }=2C
-=A0=A0=A0 [FTP_USER]=A0=A0=A0 =3D { "USER anonymous"=2C NULL }=2C
-=A0=A0=A0 [FTP_PASS]=A0=A0=A0 =3D { "PASS etherboot at etherboot.org"=2C NULL=
 }=2C
+=A0=A0=A0 [FTP_USER]=A0=A0=A0 =3D { "USER "=2C ftp_user }=2C
+=A0=A0=A0 [FTP_PASS]=A0=A0=A0 =3D { "PASS "=2C ftp_password }=2C
=A0=A0=A0=A0 [FTP_TYPE]=A0=A0=A0 =3D { "TYPE I"=2C NULL }=2C
=A0=A0=A0=A0 [FTP_PASV]=A0=A0=A0 =3D { "PASV"=2C NULL }=2C
=A0=A0=A0=A0 [FTP_RETR]=A0=A0=A0 =3D { "RETR "=2C ftp_uri_path }=2C
diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c
index a02408a..eda9f8b 100644
--- a/src/net/tcp/http.c
+++ b/src/net/tcp/http.c
@@ -437=2C21 +437=2C8 @@ static void http_step ( struct process *process ) =
{
=A0
=A0=A0=A0=A0 =A0=A0=A0 /* Construct authorisation=2C if applicable */
=A0=A0=A0=A0 =A0=A0=A0 if ( user ) {
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 char *buf =3D user_pw=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 ssize_t remaining =3D sizeof ( user_pw )=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 size_t len=3B
-
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /* URI-decode the username and password */
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 len =3D uri_decode ( user=2C buf=2C remainin=
g )=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 buf +=3D len=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 remaining -=3D len=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 *(remaining--=2C buf++) =3D ':'=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 len =3D uri_decode ( password=2C buf=2C rema=
ining )=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 buf +=3D len=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 remaining -=3D len=3B
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 assert ( remaining>=3D 0 )=3B
-
-=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 /* Base64-encode the "user:password" string =
*/
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 snprintf ( user_pw=2C user_pw_len + 1 /* NUL=
 */=2C
+=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0 "%s:%s"=2C user=2C password=
 )=3B
=A0=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 base64_encode ( user_pw=2C user_pw_base64 =
)=3B
=A0=A0=A0=A0 =A0=A0=A0 }
=A0
diff --git a/src/tests/uri_test.c b/src/tests/uri_test.c
index 2548760..aa84ace 100644
--- a/src/tests/uri_test.c
+++ b/src/tests/uri_test.c
@@ -23=2C6 +23=2C13 @@ static struct uri_test uri_tests[] =3D {
=A0=A0=A0=A0 { "tftp://192.168.0.1/"=2C "/tftpboot/vmlinuz"=2C
=A0=A0=A0=A0 =A0 "tftp://192.168.0.1/tftpboot/vmlinuz" }=2C
=A0#if 0
+=A0=A0=A0 { "ftp://:user%40isp.fr@www.fensystems.co.uk"=2C ""=2C
+=A0=A0=A0 =A0 "ftp://:user%40isp.fr@www.fensystems.co.uk/" }=2C
+=A0=A0=A0 { "https://user%40isp.fr:@etherboot.org/wiki/page1"=2C "page2"=
=2C
+=A0=A0=A0 =A0 "https://user%40isp.fr:@etherboot.org/wiki/page2" }=2C
+=A0=A0=A0 { "http://user:gpxe%40etherboot.org@etherboot.org/wiki/page1"=2C
+=A0=A0=A0 =A0 "../page3"=2C
+=A0=A0=A0 =A0 "http://user:gpxe%40etherboot.org@etherboot.org/page3" }=2C
=A0=A0=A0=A0 "http://www.etherboot.org/wiki"=2C
=A0=A0=A0=A0 "mailto:bob at nowhere.com"=2C
=A0=A0=A0=A0 "ftp://joe:secret@insecure.org:8081/hidden/path/to?what=3Dis#t=
his"=2C
--=20
1.6.5


 		 	   		 =20
_________________________________________________________________
Windows Live: Keep your friends up to date with what you do online.
http://www.microsoft.com/middleeast/windows/windowslive/see-it-in-action/so=
cial-network-basics.aspx?ocid=3DPID23461::T:WLMTAGL:ON:WL:en-xm:SI_SB_1:092=
010=

--_6be0d9ec-441d-4332-8365-40e9fa666977_
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="uriWithDecodedUserInfo.patch"

RnJvbSBhODljNWZhOTZlMzJkNTZiMDA2NzNhYjJiMGNkZGQzOWVjYTJjODliIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBnTDJuMzBZMDZhcnYyIDxnTDJuMzBZMDZhcnYyQGhvdG1haWwu
Y29tPgpEYXRlOiBTYXQsIDI2IERlYyAyMDA5IDAxOjI4OjM3ICswMjAwClN1YmplY3Q6IFtQQVRD
SF0gRGVjb2RlcyBzdHJ1Y3QgdXJpLnt1c2VyLHBhc3N3b3JkfSBtZW1iZXJzLgoKUmVwbGFjZXMg
dGhlIGVuY29kZWQgdXNlciBpbmZvICh1c2VyOnBhc3N3b3JkKSwgdGhhdCB3YXMga2VwdCBpbiBz
dHJ1Y3QKdXJpLCB3aXRoIGl0cyBkZWNvZGVkIGNvdW50ZXJwYXJ0LiAgVGhlIGRlY29kZWQgdmVy
c2lvbiBpcyBleHBlY3RlZCB0bwpiZSBtdWNoIG1vcmUgdXNlZnVsLiAgSXQgYWxzbyBhdHRlbXB0
cyB0byBhbWVuZCB0aGUgb3RoZXIgcGFydHMgb2YgdGhlCnByb2plY3QgYXBwcm9wcmlhdGVseS4K
VGhlIHJlZmVyZW5jZSBpcyBzZWN0aW9uIDMuMiBvZiBSRkMgMzk4Ni4KClNpZ25lZC1vZmYtYnk6
IGdMMm4zMFkwNmFydjIgPGdMMm4zMFkwNmFydjJAaG90bWFpbC5jb20+Ci0tLQogc3JjL2NvcmUv
dXJpLmMgICAgICAgICB8ICAgNDUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t
LS0tLS0tLS0tCiBzcmMvaW5jbHVkZS9ncHhlL3VyaS5oIHwgICAgNCArKy0tCiBzcmMvbmV0L3Rj
cC9mdHAuYyAgICAgIHwgICAyOCArKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiBzcmMvbmV0
L3RjcC9odHRwLmMgICAgIHwgICAxNyArKy0tLS0tLS0tLS0tLS0tLQogc3JjL3Rlc3RzL3VyaV90
ZXN0LmMgICB8ICAgIDcgKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCA2NSBpbnNlcnRpb25zKCsp
LCAzNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvY29yZS91cmkuYyBiL3NyYy9jb3Jl
L3VyaS5jCmluZGV4IDUwYTk2ZDMuLjYzMTY2ZTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb3JlL3VyaS5j
CisrKyBiL3NyYy9jb3JlL3VyaS5jCkBAIC00NSw5ICs0NSw5IEBAIHN0YXRpYyB2b2lkIGR1bXBf
dXJpICggc3RydWN0IHVyaSAqdXJpICkgewogCWlmICggdXJpLT5vcGFxdWUgKQogCQlEQkcgKCAi
IG9wYXF1ZSBcIiVzXCIiLCB1cmktPm9wYXF1ZSApOwogCWlmICggdXJpLT51c2VyICkKLQkJREJH
ICggIiB1c2VyIFwiJXNcIiIsIHVyaS0+dXNlciApOworCQlEQkcgKCAiIGRlY29kZWQgdXNlciBc
IiVzXCIiLCB1cmktPnVzZXIgKTsKIAlpZiAoIHVyaS0+cGFzc3dvcmQgKQotCQlEQkcgKCAiIHBh
c3N3b3JkIFwiJXNcIiIsIHVyaS0+cGFzc3dvcmQgKTsKKwkJREJHICggIiBkZWNvZGVkIHBhc3N3
b3JkIFwiJXNcIiIsIHVyaS0+cGFzc3dvcmQgKTsKIAlpZiAoIHVyaS0+aG9zdCApCiAJCURCRyAo
ICIgaG9zdCBcIiVzXCIiLCB1cmktPmhvc3QgKTsKIAlpZiAoIHVyaS0+cG9ydCApCkBAIC0xNDks
MTkgKzE0OSwyNSBAQCBzdHJ1Y3QgdXJpICogcGFyc2VfdXJpICggY29uc3QgY2hhciAqdXJpX3N0
cmluZyApIHsKIAkJdXJpLT5wYXRoID0gcGF0aDsKIAl9CiAKLQkvKiBTcGxpdCBhdXRob3JpdHkg
aW50byB1c2VyWzpwYXNzd29yZF0gYW5kIGhvc3RbOnBvcnRdIHBvcnRpb25zICovCisJLyogU3Bs
aXQgYXV0aG9yaXR5IGludG8gdXNlcls6cGFzc3dvcmRdIGFuZCBob3N0Wzpwb3J0XQorCSAgIHBv
cnRpb25zLiAgRGVjb2RlcyBhdXRob3JpdHkuICovCiAJaWYgKCAoIHRtcCA9IHN0cmNociAoIGF1
dGhvcml0eSwgJ0AnICkgKSApIHsKIAkJLyogSGFzIHVzZXJbOnBhc3N3b3JkXSAqLwogCQkqKHRt
cCsrKSA9ICdcMCc7CiAJCXVyaS0+aG9zdCA9IHRtcDsKKwkJdXJpX2RlY29kZSAoIGF1dGhvcml0
eSwgYXV0aG9yaXR5IC8qIGluIHBsYWNlICovLCAKKwkJCQlzdHJsZW4gKCBhdXRob3JpdHkgKSAr
IDEgLyogTlVMTCAqLyApOworCQkvKiBhc3NlcnQgKCB1cmktPmhvc3QgPj0gKCBhdXRob3JpdHkg
KyAKKwkJCQkJc3RybGVuICggYXV0aG9yaXR5ICkgKyAxICkgKTsgKi8KIAkJdXJpLT51c2VyID0g
YXV0aG9yaXR5OwotCQlpZiAoICggdG1wID0gc3RyY2hyICggYXV0aG9yaXR5LCAnOicgKSApICkg
eworCQlpZiAoICggdG1wID0gc3RyY2hyICggdXJpLT51c2VyLCAnOicgKSApICkgewogCQkJLyog
SGFzIHBhc3N3b3JkICovCiAJCQkqKHRtcCsrKSA9ICdcMCc7CiAJCQl1cmktPnBhc3N3b3JkID0g
dG1wOwogCQl9CisKIAl9IGVsc2UgewotCQkvKiBObyB1c2VyOnBhc3N3b3JkICovCisJCS8qIE5v
IHVzZXJbOnBhc3N3b3JkXSAqLwogCQl1cmktPmhvc3QgPSBhdXRob3JpdHk7CiAJfQogCkBAIC0y
MjksMTMgKzIzNSwxNCBAQCBpbnQgdW5wYXJzZV91cmkgKCBjaGFyICpidWYsIHNpemVfdCBzaXpl
LCBzdHJ1Y3QgdXJpICp1cmkgKSB7CiAJLyogW3VzZXJbOnBhc3N3b3JkXUBdaG9zdFs6cG9ydF0g
Ki8KIAlpZiAoIHVyaS0+aG9zdCApIHsKIAkJaWYgKCB1cmktPnVzZXIgKSB7CisJCQl1c2VkICs9
IHVyaV9lbmNvZGUgKCB1cmktPnVzZXIsICggYnVmICsgdXNlZCApLAorCQkJCQkJICggc2l6ZSAt
IHVzZWQgKSApOwogCQkJdXNlZCArPSBzc25wcmludGYgKCAoIGJ1ZiArIHVzZWQgKSwgKCBzaXpl
IC0gdXNlZCApLAotCQkJCQkgICAgIiVzIiwgdXJpLT51c2VyICk7Ci0JCQlpZiAoIHVyaS0+cGFz
c3dvcmQgKSB7Ci0JCQkJdXNlZCArPSBzc25wcmludGYgKCAoIGJ1ZiArIHVzZWQgKSwKLQkJCQkJ
CSAgICAoIHNpemUgLSB1c2VkICksCi0JCQkJCQkgICAgIjolcyIsIHVyaS0+cGFzc3dvcmQgKTsK
LQkJCX0KKwkJCQkJICAgICI6IiApOworCQkJaWYgKCB1cmktPnBhc3N3b3JkICkgCisJCQkJdXNl
ZCArPSB1cmlfZW5jb2RlICggdXJpLT5wYXNzd29yZCwKKwkJCQkJCSAgICAoIGJ1ZiArIHVzZWQg
KSwKKwkJCQkJCSAgICAoIHNpemUgLSB1c2VkICkgKTsKIAkJCXVzZWQgKz0gc3NucHJpbnRmICgg
KCBidWYgKyB1c2VkICksICggc2l6ZSAtIHVzZWQgKSwKIAkJCQkJICAgICJAIiApOwogCQl9CkBA
IC00MzUsMTIgKzQ0MiwxNCBAQCBzaXplX3QgdXJpX2VuY29kZSAoIGNvbnN0IGNoYXIgKnJhd19z
dHJpbmcsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiApIHsKIH0KIAogLyoqCi0gKiBEZWNvZGUgVVJJ
LWVuY29kZWQgc3RyaW5nCisgKiBEZWNvZGUgVVJJLWVuY29kZWQgc3RyaW5nLgogICoKICAqIEB2
IGVuY29kZWRfc3RyaW5nCVVSSS1lbmNvZGVkIHN0cmluZwogICogQHYgYnVmCQlCdWZmZXIgdG8g
Y29udGFpbiBkZWNvZGVkIHN0cmluZwogICogQHYgbGVuCQlMZW5ndGggb2YgYnVmZmVyCiAgKiBA
cmV0IGxlbgkJTGVuZ3RoIG9mIGRlY29kZWQgc3RyaW5nIChleGNsdWRpbmcgTlVMKQorICoKKyAq
IENhbiBiZSB1c2VkIHdoZW4gZW5jb2RlZF9zdHJpbmcgYW5kIGJ1ZiBvdmVybGFwIGFuZCBpbiBw
bGFjZS4KICAqLwogc2l6ZV90IHVyaV9kZWNvZGUgKCBjb25zdCBjaGFyICplbmNvZGVkX3N0cmlu
ZywgY2hhciAqYnVmLCBzaXplX3QgbGVuICkgewogCXNzaXplX3QgcmVtYWluaW5nID0gbGVuOwpA
QCAtNDQ4LDEwICs0NTcsOCBAQCBzaXplX3QgdXJpX2RlY29kZSAoIGNvbnN0IGNoYXIgKmVuY29k
ZWRfc3RyaW5nLCBjaGFyICpidWYsIHNpemVfdCBsZW4gKSB7CiAJY2hhciAqaGV4YnVmX2VuZDsK
IAl1bnNpZ25lZCBjaGFyIGM7CiAKLQlpZiAoIGxlbiApCi0JCWJ1ZlswXSA9ICdcMCc7Ci0KLQl3
aGlsZSAoICplbmNvZGVkX3N0cmluZyApIHsKKwl3aGlsZSAoICplbmNvZGVkX3N0cmluZyAgJiYg
IAorCQkJcmVtYWluaW5nID4gMSAvKiBhIE5VTEwgaXMgZXNzZW50aWFsICovICkgewogCQlpZiAo
ICplbmNvZGVkX3N0cmluZyA9PSAnJScgKSB7CiAJCQllbmNvZGVkX3N0cmluZysrOwogCQkJc25w
cmludGYgKCBoZXhidWYsIHNpemVvZiAoIGhleGJ1ZiApLCAiJXMiLApAQCAtNDYxLDcgKzQ2OCwx
MSBAQCBzaXplX3QgdXJpX2RlY29kZSAoIGNvbnN0IGNoYXIgKmVuY29kZWRfc3RyaW5nLCBjaGFy
ICpidWYsIHNpemVfdCBsZW4gKSB7CiAJCX0gZWxzZSB7CiAJCQljID0gKihlbmNvZGVkX3N0cmlu
ZysrKTsKIAkJfQotCQlzc25wcmludGYgKCBidWYrKywgcmVtYWluaW5nLS0sICIlYyIsIGMgKTsK
KwkJKihyZW1haW5pbmctLSwgYnVmKyspID0gYzsKIAl9CisKKwlpZiAoIHJlbWFpbmluZyApCisJ
CSpidWYgPSAnXDAnOworCiAJcmV0dXJuICggbGVuIC0gcmVtYWluaW5nICk7CiB9CmRpZmYgLS1n
aXQgYS9zcmMvaW5jbHVkZS9ncHhlL3VyaS5oIGIvc3JjL2luY2x1ZGUvZ3B4ZS91cmkuaAppbmRl
eCAwM2M4OGQyLi5kZThkNWE5IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ncHhlL3VyaS5oCisr
KyBiL3NyYy9pbmNsdWRlL2dweGUvdXJpLmgKQEAgLTQ3LDkgKzQ3LDkgQEAgc3RydWN0IHVyaSB7
CiAJY29uc3QgY2hhciAqc2NoZW1lOwogCS8qKiBPcGFxdWUgcGFydCAqLwogCWNvbnN0IGNoYXIg
Km9wYXF1ZTsKLQkvKiogVXNlciBuYW1lICovCisJLyoqIERlY29kZWQgdXNlciBuYW1lICovCiAJ
Y29uc3QgY2hhciAqdXNlcjsKLQkvKiogUGFzc3dvcmQgKi8KKwkvKiogRGVjb2RlZCBwYXNzd29y
ZCAqLwogCWNvbnN0IGNoYXIgKnBhc3N3b3JkOwogCS8qKiBIb3N0IG5hbWUgKi8KIAljb25zdCBj
aGFyICpob3N0OwpkaWZmIC0tZ2l0IGEvc3JjL25ldC90Y3AvZnRwLmMgYi9zcmMvbmV0L3RjcC9m
dHAuYwppbmRleCAwNzE5YmY3Li4yNjEwM2Y2IDEwMDY0NAotLS0gYS9zcmMvbmV0L3RjcC9mdHAu
YworKysgYi9zcmMvbmV0L3RjcC9mdHAuYwpAQCAtMTMxLDExICsxMzEsMzUgQEAgc3RhdGljIGNv
bnN0IGNoYXIgKiBmdHBfdXJpX3BhdGggKCBzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCApIHsKIAly
ZXR1cm4gZnRwLT51cmktPnBhdGg7CiB9CiAKKy8qKgorICogUmV0cmlldmUgRlRQIHVzZXIKKyAq
CisgKiBAdiBmdHAJCUZUUCByZXF1ZXN0CisgKiBAcmV0IHVzZXIJCUZUUCB1c2VyCisgKi8KK3N0
YXRpYyBjb25zdCBjaGFyICogZnRwX3VzZXIgKCBzdHJ1Y3QgZnRwX3JlcXVlc3QgKmZ0cCApIHsK
KwlzdGF0aWMgY2hhciAqZnRwX2RlZmF1bHRfdXNlciA9ICJhbm9ueW1vdXMiOworCXJldHVybiBm
dHAtPnVyaS0+dXNlciA/IGZ0cC0+dXJpLT51c2VyIDogZnRwX2RlZmF1bHRfdXNlcjsKK30KKwor
LyoqCisgKiBSZXRyaWV2ZSBGVFAgcGFzc3dvcmQKKyAqCisgKiBAdiBmdHAJCUZUUCByZXF1ZXN0
CisgKiBAcmV0IHBhc3N3b3JkCUZUUCBwYXNzd29yZAorICovCitzdGF0aWMgY29uc3QgY2hhciAq
IGZ0cF9wYXNzd29yZCAoIHN0cnVjdCBmdHBfcmVxdWVzdCAqZnRwICkgeworCXN0YXRpYyBjaGFy
ICpmdHBfZGVmYXVsdF9wYXNzd29yZCA9IAorCQkJCQkiZXRoZXJib290QGV0aGVyYm9vdC5vcmci
OworCXJldHVybiBmdHAtPnVyaS0+cGFzc3dvcmQgPyAKKwkJZnRwLT51cmktPnBhc3N3b3JkIDog
ZnRwX2RlZmF1bHRfcGFzc3dvcmQ7Cit9CisKIC8qKiBGVFAgY29udHJvbCBjaGFubmVsIHN0cmlu
Z3MgKi8KIHN0YXRpYyBzdHJ1Y3QgZnRwX2NvbnRyb2xfc3RyaW5nIGZ0cF9zdHJpbmdzW10gPSB7
CiAJW0ZUUF9DT05ORUNUXQk9IHsgTlVMTCwgTlVMTCB9LAotCVtGVFBfVVNFUl0JPSB7ICJVU0VS
IGFub255bW91cyIsIE5VTEwgfSwKLQlbRlRQX1BBU1NdCT0geyAiUEFTUyBldGhlcmJvb3RAZXRo
ZXJib290Lm9yZyIsIE5VTEwgfSwKKwlbRlRQX1VTRVJdCT0geyAiVVNFUiAiLCBmdHBfdXNlciB9
LAorCVtGVFBfUEFTU10JPSB7ICJQQVNTICIsIGZ0cF9wYXNzd29yZCB9LAogCVtGVFBfVFlQRV0J
PSB7ICJUWVBFIEkiLCBOVUxMIH0sCiAJW0ZUUF9QQVNWXQk9IHsgIlBBU1YiLCBOVUxMIH0sCiAJ
W0ZUUF9SRVRSXQk9IHsgIlJFVFIgIiwgZnRwX3VyaV9wYXRoIH0sCmRpZmYgLS1naXQgYS9zcmMv
bmV0L3RjcC9odHRwLmMgYi9zcmMvbmV0L3RjcC9odHRwLmMKaW5kZXggYTAyNDA4YS4uZWRhOWY4
YiAxMDA2NDQKLS0tIGEvc3JjL25ldC90Y3AvaHR0cC5jCisrKyBiL3NyYy9uZXQvdGNwL2h0dHAu
YwpAQCAtNDM3LDIxICs0MzcsOCBAQCBzdGF0aWMgdm9pZCBodHRwX3N0ZXAgKCBzdHJ1Y3QgcHJv
Y2VzcyAqcHJvY2VzcyApIHsKIAogCQkvKiBDb25zdHJ1Y3QgYXV0aG9yaXNhdGlvbiwgaWYgYXBw
bGljYWJsZSAqLwogCQlpZiAoIHVzZXIgKSB7Ci0JCQljaGFyICpidWYgPSB1c2VyX3B3OwotCQkJ
c3NpemVfdCByZW1haW5pbmcgPSBzaXplb2YgKCB1c2VyX3B3ICk7Ci0JCQlzaXplX3QgbGVuOwot
Ci0JCQkvKiBVUkktZGVjb2RlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgKi8KLQkJCWxlbiA9
IHVyaV9kZWNvZGUgKCB1c2VyLCBidWYsIHJlbWFpbmluZyApOwotCQkJYnVmICs9IGxlbjsKLQkJ
CXJlbWFpbmluZyAtPSBsZW47Ci0JCQkqKHJlbWFpbmluZy0tLCBidWYrKykgPSAnOic7Ci0JCQls
ZW4gPSB1cmlfZGVjb2RlICggcGFzc3dvcmQsIGJ1ZiwgcmVtYWluaW5nICk7Ci0JCQlidWYgKz0g
bGVuOwotCQkJcmVtYWluaW5nIC09IGxlbjsKLQkJCWFzc2VydCAoIHJlbWFpbmluZyA+PSAwICk7
Ci0KLQkJCS8qIEJhc2U2NC1lbmNvZGUgdGhlICJ1c2VyOnBhc3N3b3JkIiBzdHJpbmcgKi8KKwkJ
CXNucHJpbnRmICggdXNlcl9wdywgdXNlcl9wd19sZW4gKyAxIC8qIE5VTCAqLywKKwkJCQkgICAi
JXM6JXMiLCB1c2VyLCBwYXNzd29yZCApOwogCQkJYmFzZTY0X2VuY29kZSAoIHVzZXJfcHcsIHVz
ZXJfcHdfYmFzZTY0ICk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL3VyaV90ZXN0LmMg
Yi9zcmMvdGVzdHMvdXJpX3Rlc3QuYwppbmRleCAyNTQ4NzYwLi5hYTg0YWNlIDEwMDY0NAotLS0g
YS9zcmMvdGVzdHMvdXJpX3Rlc3QuYworKysgYi9zcmMvdGVzdHMvdXJpX3Rlc3QuYwpAQCAtMjMs
NiArMjMsMTMgQEAgc3RhdGljIHN0cnVjdCB1cmlfdGVzdCB1cmlfdGVzdHNbXSA9IHsKIAl7ICJ0
ZnRwOi8vMTkyLjE2OC4wLjEvIiwgIi90ZnRwYm9vdC92bWxpbnV6IiwKIAkgICJ0ZnRwOi8vMTky
LjE2OC4wLjEvdGZ0cGJvb3Qvdm1saW51eiIgfSwKICNpZiAwCisJeyAiZnRwOi8vOnVzZXIlNDBp
c3AuZnJAd3d3LmZlbnN5c3RlbXMuY28udWsiLCAiIiwKKwkgICJmdHA6Ly86dXNlciU0MGlzcC5m
ckB3d3cuZmVuc3lzdGVtcy5jby51ay8iIH0sCisJeyAiaHR0cHM6Ly91c2VyJTQwaXNwLmZyOkBl
dGhlcmJvb3Qub3JnL3dpa2kvcGFnZTEiLCAicGFnZTIiLAorCSAgImh0dHBzOi8vdXNlciU0MGlz
cC5mcjpAZXRoZXJib290Lm9yZy93aWtpL3BhZ2UyIiB9LAorCXsgImh0dHA6Ly91c2VyOmdweGUl
NDBldGhlcmJvb3Qub3JnQGV0aGVyYm9vdC5vcmcvd2lraS9wYWdlMSIsCisJICAiLi4vcGFnZTMi
LAorCSAgImh0dHA6Ly91c2VyOmdweGUlNDBldGhlcmJvb3Qub3JnQGV0aGVyYm9vdC5vcmcvcGFn
ZTMiIH0sCiAJImh0dHA6Ly93d3cuZXRoZXJib290Lm9yZy93aWtpIiwKIAkibWFpbHRvOmJvYkBu
b3doZXJlLmNvbSIsCiAJImZ0cDovL2pvZTpzZWNyZXRAaW5zZWN1cmUub3JnOjgwODEvaGlkZGVu
L3BhdGgvdG8/d2hhdD1pcyN0aGlzIiwKLS0gCjEuNi41Cgo=

--_6be0d9ec-441d-4332-8365-40e9fa666977_--


More information about the gPXE mailing list