[gPXE-devel] [PATCH 1/2] [uri] Fix NULL dereference in parse_uri()

Piotr Jaroszyński p.jaroszynski at gmail.com
Sun Apr 18 11:14:21 EDT 2010


Don't try to parse authority if it's not there.

Signed-off-by: Piotr Jaroszyński <p.jaroszynski at gmail.com>
---
 src/core/uri.c |   44 ++++++++++++++++++++++----------------------
 1 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/src/core/uri.c b/src/core/uri.c
index 6a1f2e5..1a43206 100644
--- a/src/core/uri.c
+++ b/src/core/uri.c
@@ -129,7 +129,10 @@ struct uri * parse_uri ( const char *uri_string ) {
 	}
 
 	/* Identify net/absolute/relative path */
-	if ( strncmp ( path, "//", 2 ) == 0 ) {
+	if ( strncmp ( path, "//", 2 ) != 0 ) {
+		/* Absolute/relative path */
+		uri->path = path;
+	} else {
 		/* Net path.  If this is terminated by the first '/'
 		 * of an absolute path, then we have no space for a
 		 * terminator after the authority field, so shuffle
@@ -145,31 +148,28 @@ struct uri * parse_uri ( const char *uri_string ) {
 			authority--;
 			*(--tmp) = '\0';
 		}
-	} else {
-		/* Absolute/relative path */
-		uri->path = path;
-	}
 
-	/* Split authority into user[:password] and host[:port] portions */
-	if ( ( tmp = strchr ( authority, '@' ) ) ) {
-		/* Has user[:password] */
-		*(tmp++) = '\0';
-		uri->host = tmp;
-		uri->user = authority;
-		if ( ( tmp = strchr ( authority, ':' ) ) ) {
-			/* Has password */
+		/* Split authority into user[:password] and host[:port] portions */
+		if ( ( tmp = strchr ( authority, '@' ) ) ) {
+			/* Has user[:password] */
 			*(tmp++) = '\0';
-			uri->password = tmp;
+			uri->host = tmp;
+			uri->user = authority;
+			if ( ( tmp = strchr ( authority, ':' ) ) ) {
+				/* Has password */
+				*(tmp++) = '\0';
+				uri->password = tmp;
+			}
+		} else {
+			/* No user:password */
+			uri->host = authority;
 		}
-	} else {
-		/* No user:password */
-		uri->host = authority;
-	}
 
-	/* Split host into host[:port] */
-	if ( ( tmp = strchr ( uri->host, ':' ) ) ) {
-		*(tmp++) = '\0';
-		uri->port = tmp;
+		/* Split host into host[:port] */
+		if ( ( tmp = strchr ( uri->host, ':' ) ) ) {
+			*(tmp++) = '\0';
+			uri->port = tmp;
+		}
 	}
 
 	/* Decode fields that should be decoded */
-- 
1.7.0.4



More information about the gPXE-devel mailing list