summaryrefslogtreecommitdiffstats
path: root/src/core/uri.c
diff options
context:
space:
mode:
authorMichael Brown2008-10-24 05:08:43 +0200
committerMichael Brown2008-10-24 05:08:43 +0200
commit3fe6bede749e6e36d9dd321273472fe418fad56e (patch)
treeca959718f121ff49cdb1157907d82d02933c5d81 /src/core/uri.c
parent[phantom] Change register space abstraction to match other drivers (diff)
downloadipxe-3fe6bede749e6e36d9dd321273472fe418fad56e.tar.gz
ipxe-3fe6bede749e6e36d9dd321273472fe418fad56e.tar.xz
ipxe-3fe6bede749e6e36d9dd321273472fe418fad56e.zip
[uri] Avoid interpreting DOS-style path names as opaque URIs
A DOS-style full path name such as "C:\Program Files\tftpboot\nbp.0" satisfies the syntax requirements for a URI with a scheme of "C" and an opaque portion of "\Program Files\tftpboot\nbp.0". Add a check in parse_uri() to ignore schemes that are apparently only a single character long; this avoids interpreting DOS-style paths in this way, and shouldn't affect any practical URI scheme.
Diffstat (limited to 'src/core/uri.c')
-rw-r--r--src/core/uri.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/core/uri.c b/src/core/uri.c
index cf2b071d..7bb46da0 100644
--- a/src/core/uri.c
+++ b/src/core/uri.c
@@ -92,8 +92,12 @@ struct uri * parse_uri ( const char *uri_string ) {
uri->fragment = tmp;
}
- /* Identify absolute/relative URI */
- if ( ( tmp = strchr ( raw, ':' ) ) ) {
+ /* Identify absolute/relative URI. We ignore schemes that are
+ * apparently only a single character long, since otherwise we
+ * misinterpret a DOS-style path name ("C:\path\to\file") as a
+ * URI with scheme="C",opaque="\path\to\file".
+ */
+ if ( ( tmp = strchr ( raw, ':' ) ) && ( tmp > ( raw + 1 ) ) ) {
/* Absolute URI: identify hierarchical/opaque */
uri->scheme = raw;
*(tmp++) = '\0';