diff --git a/src/include/ipxe/uri.h b/src/include/ipxe/uri.h index cb0898e4..b7b8b441 100644 --- a/src/include/ipxe/uri.h +++ b/src/include/ipxe/uri.h @@ -113,6 +113,16 @@ static inline int uri_is_absolute ( struct uri *uri ) { return ( uri->scheme != NULL ); } +/** + * URI has a path + * + * @v uri URI + * @ret has_path URI has a path + */ +static inline int uri_has_path ( struct uri *uri ) { + return ( uri->path && ( uri->path[0] != '\0' ) ); +} + /** * URI has an absolute path * diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c index 91f1c6e8..bb7d692e 100644 --- a/src/usr/autoboot.c +++ b/src/usr/autoboot.c @@ -66,8 +66,9 @@ static struct net_device * find_boot_netdev ( void ) { */ static struct uri * parse_next_server_and_filename ( struct in_addr next_server, const char *filename ) { + char buf[ 23 /* "tftp://xxx.xxx.xxx.xxx/" */ + strlen ( filename ) + + 1 /* NUL */ ]; struct uri *uri; - struct uri *tmp; /* Parse filename */ uri = parse_uri ( filename ); @@ -80,12 +81,11 @@ static struct uri * parse_next_server_and_filename ( struct in_addr next_server, * filenames with and without initial slashes, which is * significant for TFTP. */ - if ( ! uri_is_absolute ( uri ) ) { - tmp = uri; - tmp->scheme = "tftp"; - tmp->host = inet_ntoa ( next_server ); - uri = uri_dup ( tmp ); - uri_put ( tmp ); + if ( next_server.s_addr && filename[0] && ! uri_is_absolute ( uri ) ) { + uri_put ( uri ); + snprintf ( buf, sizeof ( buf ), "tftp://%s/%s", + inet_ntoa ( next_server ), filename ); + uri = parse_uri ( buf ); if ( ! uri ) return NULL; } @@ -130,7 +130,7 @@ int uriboot ( struct uri *filename, struct uri *root_path ) { } /* Treat empty URIs as absent */ - if ( filename && ( ! filename->path ) ) + if ( filename && ( ! uri_has_path ( filename ) ) ) filename = NULL; if ( root_path && ( ! uri_is_absolute ( root_path ) ) ) root_path = NULL;