From f94ca3311758854670d25ba4e7853d76c2113402 Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Thu, 27 Feb 2014 13:54:32 +0800 Subject: discover/pxe: pxe parser should only treat "::" paths as absolute PXELinux treats all paths as relative, requiring a "::/path" syntax for truly absolute URLs. This change implements the same behaviour in petitboot, and updates the testcases to suit. Signed-off-by: Jeremy Kerr --- discover/pxe-parser.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) (limited to 'discover') diff --git a/discover/pxe-parser.c b/discover/pxe-parser.c index 17ae55e..98e1603 100644 --- a/discover/pxe-parser.c +++ b/discover/pxe-parser.c @@ -28,6 +28,44 @@ static void pxe_finish(struct conf_context *conf) discover_context_add_boot_option(conf->dc, info->opt); } +/* We need a slightly modified version of pb_url_join, to allow for the + * pxelinux "::filename" syntax for absolute URLs + */ +static struct pb_url *pxe_url_join(void *ctx, const struct pb_url *url, + const char *s) +{ + struct pb_url *new_url; + int len; + + len = strlen(s); + + if (len > 2 && s[0] == ':' && s[1] == ':') { + char *tmp; + + if (s[2] == '/') { + /* ::/path -> /path */ + tmp = talloc_strdup(ctx, s+2); + } else { + /* ::path -> /path */ + tmp = talloc_strdup(ctx, s+1); + tmp[0] = '/'; + } + + new_url = pb_url_join(ctx, url, tmp); + + talloc_free(tmp); + + } else { + const char *tmp; + /* strip leading slashes */ + for (tmp = s; *tmp == '/'; tmp++); + ; + new_url = pb_url_join(ctx, url, tmp); + } + + return new_url; +} + static void pxe_process_pair(struct conf_context *ctx, const char *name, char *value) { @@ -72,11 +110,11 @@ static void pxe_process_pair(struct conf_context *ctx, return; if (streq(name, "KERNEL")) { - url = pb_url_join(ctx->dc, ctx->dc->conf_url, value); + url = pxe_url_join(ctx->dc, ctx->dc->conf_url, value); opt->boot_image = create_url_resource(opt, url); } else if (streq(name, "INITRD")) { - url = pb_url_join(ctx->dc, ctx->dc->conf_url, value); + url = pxe_url_join(ctx->dc, ctx->dc->conf_url, value); opt->initrd = create_url_resource(opt, url); } else if (streq(name, "APPEND")) { @@ -90,7 +128,7 @@ static void pxe_process_pair(struct conf_context *ctx, end = strchrnul(str, ' '); *end = '\0'; - url = pb_url_join(ctx->dc, ctx->dc->conf_url, str); + url = pxe_url_join(ctx->dc, ctx->dc->conf_url, str); opt->initrd = create_url_resource(opt, url); } } -- cgit v1.2.1