Message ID | 20190117024512.24538-1-sam@mendozajonas.com |
---|---|
State | Accepted |
Headers | show |
Series | lib/url: Include port in pb_url_to_string() | expand |
On Thu, 2019-01-17 at 13:45 +1100, Samuel Mendoza-Jonas wrote: > 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 <sam@mendozajonas.com> Merged as 28d0d703. > --- > 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 44e9ac40..b74018dd 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 483add90..f9083bd6 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 00000000..c7d018e0 > --- /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"); > +}
diff --git a/lib/url/url.c b/lib/url/url.c index 44e9ac40..b74018dd 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 483add90..f9083bd6 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 00000000..c7d018e0 --- /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"); +}
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 <sam@mendozajonas.com> --- 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