summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2014-02-27 13:54:32 +0800
committerJeremy Kerr <jk@ozlabs.org>2014-02-27 13:54:32 +0800
commitf94ca3311758854670d25ba4e7853d76c2113402 (patch)
tree8ea7d571a5c986bb93f11b03f6a8eec8e74cd057
parent922756a3aefd8ba5c5675efd37df9f43938cf432 (diff)
downloadtalos-petitboot-f94ca3311758854670d25ba4e7853d76c2113402.tar.gz
talos-petitboot-f94ca3311758854670d25ba4e7853d76c2113402.zip
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 <jk@ozlabs.org>
-rw-r--r--discover/pxe-parser.c44
-rw-r--r--test/parser/Makefile.am2
-rw-r--r--test/parser/test-pxe-non-url-pathprefix-with-conf.c3
-rw-r--r--test/parser/test-pxe-path-resolve-absolute.c36
-rw-r--r--test/parser/test-pxe-path-resolve-relative.c36
-rw-r--r--test/parser/test-pxe-pathprefix-discover-mac.c2
-rw-r--r--test/parser/test-pxe-pathprefix-discover.c2
-rw-r--r--test/parser/test-pxe-pathprefix-with-conf.c3
8 files changed, 121 insertions, 7 deletions
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);
}
}
diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am
index aeb16d8..62770d2 100644
--- a/test/parser/Makefile.am
+++ b/test/parser/Makefile.am
@@ -67,6 +67,8 @@ TESTS = \
test-pxe-non-url-pathprefix-with-conf \
test-pxe-pathprefix-discover \
test-pxe-pathprefix-discover-mac \
+ test-pxe-path-resolve-relative \
+ test-pxe-path-resolve-absolute \
test-unresolved-remove
$(TESTS): %: %.embedded-config.o
diff --git a/test/parser/test-pxe-non-url-pathprefix-with-conf.c b/test/parser/test-pxe-non-url-pathprefix-with-conf.c
index 36d4726..b8cc2c2 100644
--- a/test/parser/test-pxe-non-url-pathprefix-with-conf.c
+++ b/test/parser/test-pxe-non-url-pathprefix-with-conf.c
@@ -34,5 +34,6 @@ void run_test(struct parser_test *test)
check_resolved_url_resource(opt->boot_image,
"tftp://host/path/to/./kernel");
- check_resolved_url_resource(opt->initrd, "tftp://host/initrd");
+ check_resolved_url_resource(opt->initrd,
+ "tftp://host/path/to/initrd");
}
diff --git a/test/parser/test-pxe-path-resolve-absolute.c b/test/parser/test-pxe-path-resolve-absolute.c
new file mode 100644
index 0000000..04502fc
--- /dev/null
+++ b/test/parser/test-pxe-path-resolve-absolute.c
@@ -0,0 +1,36 @@
+
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+label linux
+kernel ::vmlinux
+initrd ::/initrd
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_read_conf_embedded_url(test, "tftp://host/path/conf.txt");
+
+ test_set_event_source(test);
+ test_set_event_param(test->ctx->event, "siaddr", "host");
+ test_set_event_param(test->ctx->event, "pxeconffile", "path/conf.txt");
+
+ test_run_parser(test, "pxe");
+
+ ctx = test->ctx;
+
+ check_boot_option_count(ctx, 1);
+ opt = get_boot_option(ctx, 0);
+
+ check_name(opt, "linux");
+
+ /* even though the initrd is specifed as /initrd, pxelinux treats
+ * this as relative. */
+ check_resolved_url_resource(opt->boot_image,
+ "tftp://host/vmlinux");
+ check_resolved_url_resource(opt->initrd,
+ "tftp://host/initrd");
+}
diff --git a/test/parser/test-pxe-path-resolve-relative.c b/test/parser/test-pxe-path-resolve-relative.c
new file mode 100644
index 0000000..920c139
--- /dev/null
+++ b/test/parser/test-pxe-path-resolve-relative.c
@@ -0,0 +1,36 @@
+
+#include "parser-test.h"
+
+#if 0 /* PARSER_EMBEDDED_CONFIG */
+label linux
+kernel vmlinux
+initrd /initrd
+#endif
+
+void run_test(struct parser_test *test)
+{
+ struct discover_boot_option *opt;
+ struct discover_context *ctx;
+
+ test_read_conf_embedded_url(test, "tftp://host/path/conf.txt");
+
+ test_set_event_source(test);
+ test_set_event_param(test->ctx->event, "siaddr", "host");
+ test_set_event_param(test->ctx->event, "pxeconffile", "path/conf.txt");
+
+ test_run_parser(test, "pxe");
+
+ ctx = test->ctx;
+
+ check_boot_option_count(ctx, 1);
+ opt = get_boot_option(ctx, 0);
+
+ check_name(opt, "linux");
+
+ /* even though the initrd is specifed as /initrd, pxelinux treats
+ * this as relative. */
+ check_resolved_url_resource(opt->boot_image,
+ "tftp://host/path/vmlinux");
+ check_resolved_url_resource(opt->initrd,
+ "tftp://host/path/initrd");
+}
diff --git a/test/parser/test-pxe-pathprefix-discover-mac.c b/test/parser/test-pxe-pathprefix-discover-mac.c
index 1e5fa71..3c003fa 100644
--- a/test/parser/test-pxe-pathprefix-discover-mac.c
+++ b/test/parser/test-pxe-pathprefix-discover-mac.c
@@ -37,5 +37,5 @@ void run_test(struct parser_test *test)
check_resolved_url_resource(opt->boot_image,
"tftp://host/path/to/./kernel");
check_resolved_url_resource(opt->initrd,
- "tftp://host/initrd");
+ "tftp://host/path/to/initrd");
}
diff --git a/test/parser/test-pxe-pathprefix-discover.c b/test/parser/test-pxe-pathprefix-discover.c
index 9cb44c8..8048961 100644
--- a/test/parser/test-pxe-pathprefix-discover.c
+++ b/test/parser/test-pxe-pathprefix-discover.c
@@ -36,5 +36,5 @@ void run_test(struct parser_test *test)
check_resolved_url_resource(opt->boot_image,
"tftp://host/path/to/./kernel");
check_resolved_url_resource(opt->initrd,
- "tftp://host/initrd");
+ "tftp://host/path/to/initrd");
}
diff --git a/test/parser/test-pxe-pathprefix-with-conf.c b/test/parser/test-pxe-pathprefix-with-conf.c
index 57f942d..ce1d600 100644
--- a/test/parser/test-pxe-pathprefix-with-conf.c
+++ b/test/parser/test-pxe-pathprefix-with-conf.c
@@ -34,5 +34,6 @@ void run_test(struct parser_test *test)
check_resolved_url_resource(opt->boot_image,
"tftp://host/path/to/./kernel");
- check_resolved_url_resource(opt->initrd, "tftp://host/initrd");
+ check_resolved_url_resource(opt->initrd,
+ "tftp://host/path/to/initrd");
}
OpenPOWER on IntegriCloud