From 28d0d7035ee3099935ef264db40a86142c098ec5 Mon Sep 17 00:00:00 2001 From: Samuel Mendoza-Jonas Date: Thu, 17 Jan 2019 13:32:24 +1100 Subject: lib/url: Include port in pb_url_to_string() And include a pxe-parser test which uses a port in the path prefix to exercise this. This could cause PXE discovery failures if parameters such as pathprefix included a port in the URL. Signed-off-by: Samuel Mendoza-Jonas --- lib/url/url.c | 15 +++++++++---- test/parser/Makefile.am | 1 + test/parser/test-pxe-pathprefix-port.c | 40 ++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 test/parser/test-pxe-pathprefix-port.c diff --git a/lib/url/url.c b/lib/url/url.c index 44e9ac4..b74018d 100644 --- a/lib/url/url.c +++ b/lib/url/url.c @@ -265,14 +265,21 @@ int addr_scheme(const char *address) char *pb_url_to_string(struct pb_url *url) { const struct pb_scheme_info *scheme = pb_url_scheme_info(url->scheme); + char *str, *port; assert(scheme); + port = url->port ? talloc_asprintf(url, ":%s", url->port) : NULL; + if (scheme->has_host && addr_scheme(url->host) == AF_INET6) - return talloc_asprintf(url, "%s://[%s]%s", scheme->str, - url->host, url->path); + str = talloc_asprintf(url, "%s://[%s]%s%s", scheme->str, + url->host, port ?: "", url->path); else - return talloc_asprintf(url, "%s://%s%s", scheme->str, - scheme->has_host ? url->host : "", url->path); + str = talloc_asprintf(url, "%s://%s%s%s", scheme->str, + scheme->has_host ? url->host : "", + port ?: "", url->path); + + talloc_free(port); + return str; } static void pb_url_update_full(struct pb_url *url) diff --git a/test/parser/Makefile.am b/test/parser/Makefile.am index 483add9..f9083bd 100644 --- a/test/parser/Makefile.am +++ b/test/parser/Makefile.am @@ -75,6 +75,7 @@ parser_TESTS = \ test/parser/test-pxe-non-url-pathprefix-with-conf \ test/parser/test-pxe-pathprefix-discover \ test/parser/test-pxe-pathprefix-discover-mac \ + test/parser/test-pxe-pathprefix-port \ test/parser/test-pxe-path-resolve-relative \ test/parser/test-pxe-path-resolve-absolute \ test/parser/test-pxe-discover-bootfile-root \ diff --git a/test/parser/test-pxe-pathprefix-port.c b/test/parser/test-pxe-pathprefix-port.c new file mode 100644 index 0000000..c7d018e --- /dev/null +++ b/test/parser/test-pxe-pathprefix-port.c @@ -0,0 +1,40 @@ + +#include "parser-test.h" + +#if 0 /* PARSER_EMBEDDED_CONFIG */ +default linux + +label linux +kernel ./kernel +append command line +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, + "http://host:8080/path/to/pxelinux.cfg/default"); + + test_set_event_source(test); + test_set_event_param(test->ctx->event, "ip", "192.168.0.1"); + test_set_event_param(test->ctx->event, "pxepathprefix", + "http://host:8080/path/to/"); + + test_run_parser(test, "pxe"); + + ctx = test->ctx; + + check_boot_option_count(ctx, 1); + opt = get_boot_option(ctx, 0); + + check_name(opt, "linux"); + check_args(opt, "command line"); + + check_resolved_url_resource(opt->boot_image, + "http://host:8080/path/to/./kernel"); + check_resolved_url_resource(opt->initrd, + "http://host:8080/path/to/initrd"); +} -- cgit v1.2.1