From 7b0c5629078b05b7be0e04c0051c1c4ea0b61aec Mon Sep 17 00:00:00 2001 From: Mark Laing Date: Mon, 10 Jun 2024 11:05:36 +0100 Subject: [PATCH] lxc: Parse location header into URL. The location header must be parsed into a URL before extracting the IP address. This is so we can get the IP from the path only, and not from the full URL string (which may contain query parameters). Signed-off-by: Mark Laing --- lxc/network_forward.go | 8 +++++++- lxc/network_load_balancer.go | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lxc/network_forward.go b/lxc/network_forward.go index 937925a0bd4f..7df61c8fa411 100644 --- a/lxc/network_forward.go +++ b/lxc/network_forward.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net" + "net/url" "os" "sort" "strings" @@ -340,8 +341,13 @@ func (c *cmdNetworkForwardCreate) run(cmd *cobra.Command, args []string) error { return err } + networkForwardURL, err := url.Parse(transporter.location) + if err != nil { + return fmt.Errorf("Received invalid location header %q: %w", transporter.location, err) + } + forwardURLPrefix := api.NewURL().Path(version.APIVersion, "networks", networkName, "forwards").String() - _, err = fmt.Sscanf(transporter.location, forwardURLPrefix+"/%s", &listenAddress) + _, err = fmt.Sscanf(networkForwardURL.Path, forwardURLPrefix+"/%s", &listenAddress) if err != nil { return fmt.Errorf("Received unexpected location header %q: %w", transporter.location, err) } diff --git a/lxc/network_load_balancer.go b/lxc/network_load_balancer.go index 8a1117a7f298..6413b6224af6 100644 --- a/lxc/network_load_balancer.go +++ b/lxc/network_load_balancer.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "net" + "net/url" "os" "sort" "strings" @@ -344,8 +345,13 @@ func (c *cmdNetworkLoadBalancerCreate) run(cmd *cobra.Command, args []string) er return err } + loadBalancerURL, err := url.Parse(transporter.location) + if err != nil { + return fmt.Errorf("Received invalid location header %q: %w", transporter.location, err) + } + loadBalancerURLPrefix := api.NewURL().Path(version.APIVersion, "networks", networkName, "load-balancers").String() - _, err = fmt.Sscanf(transporter.location, loadBalancerURLPrefix+"/%s", &listenAddress) + _, err = fmt.Sscanf(loadBalancerURL.Path, loadBalancerURLPrefix+"/%s", &listenAddress) if err != nil { return fmt.Errorf("Received unexpected location header %q: %w", transporter.location, err) }