aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/uri.c15
-rw-r--r--src/tests/uri_test.c10
2 files changed, 20 insertions, 5 deletions
diff --git a/src/core/uri.c b/src/core/uri.c
index a0f79e9..b82472e 100644
--- a/src/core/uri.c
+++ b/src/core/uri.c
@@ -334,8 +334,15 @@ struct uri * parse_uri ( const char *uri_string ) {
uri->efragment = tmp;
}
- /* Identify absolute/relative URI */
- if ( ( tmp = strchr ( raw, ':' ) ) ) {
+ /* Identify absolute URIs */
+ epath = raw;
+ for ( tmp = raw ; ; tmp++ ) {
+ /* Possible scheme character (for our URI schemes) */
+ if ( isalpha ( *tmp ) || ( *tmp == '-' ) || ( *tmp == '_' ) )
+ continue;
+ /* Invalid scheme character or NUL: is a relative URI */
+ if ( *tmp != ':' )
+ break;
/* Absolute URI: identify hierarchical/opaque */
uri->scheme = raw;
*(tmp++) = '\0';
@@ -347,9 +354,7 @@ struct uri * parse_uri ( const char *uri_string ) {
uri->opaque = tmp;
epath = NULL;
}
- } else {
- /* Relative URI */
- epath = raw;
+ break;
}
/* If we don't have a path (i.e. we have an absolute URI with
diff --git a/src/tests/uri_test.c b/src/tests/uri_test.c
index 929ab36..338f479 100644
--- a/src/tests/uri_test.c
+++ b/src/tests/uri_test.c
@@ -657,6 +657,15 @@ static struct uri_test uri_file_volume = {
},
};
+/** Relative URI with colons in path */
+static struct uri_test uri_colons = {
+ "/boot/52:54:00:12:34:56/boot.ipxe",
+ {
+ .path = "/boot/52:54:00:12:34:56/boot.ipxe",
+ .epath = "/boot/52:54:00:12:34:56/boot.ipxe",
+ },
+};
+
/** URI with port number */
static struct uri_port_test uri_explicit_port = {
"http://192.168.0.1:8080/boot.php",
@@ -957,6 +966,7 @@ static void uri_test_exec ( void ) {
uri_parse_format_dup_ok ( &uri_file_relative );
uri_parse_format_dup_ok ( &uri_file_absolute );
uri_parse_format_dup_ok ( &uri_file_volume );
+ uri_parse_format_dup_ok ( &uri_colons );
/** URI port number tests */
uri_port_ok ( &uri_explicit_port );