Browse Source

embed: reject binding listeners to domain names

Fixes #6336
Anthony Romano 9 years ago
parent
commit
2752169d6a
1 changed files with 27 additions and 0 deletions
  1. 27 0
      embed/config.go

+ 27 - 0
embed/config.go

@@ -17,6 +17,7 @@ package embed
 import (
 import (
 	"fmt"
 	"fmt"
 	"io/ioutil"
 	"io/ioutil"
+	"net"
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 	"strings"
 	"strings"
@@ -253,6 +254,13 @@ func (cfg *configYAML) configFromFile(path string) error {
 }
 }
 
 
 func (cfg *Config) Validate() error {
 func (cfg *Config) Validate() error {
+	if err := checkBindURLs(cfg.LPUrls); err != nil {
+		return err
+	}
+	if err := checkBindURLs(cfg.LCUrls); err != nil {
+		return err
+	}
+
 	// Check if conflicting flags are passed.
 	// Check if conflicting flags are passed.
 	nSet := 0
 	nSet := 0
 	for _, v := range []bool{cfg.Durl != "", cfg.InitialCluster != "", cfg.DNSCluster != ""} {
 	for _, v := range []bool{cfg.Durl != "", cfg.InitialCluster != "", cfg.DNSCluster != ""} {
@@ -346,3 +354,22 @@ func (cfg Config) IsDefaultHost() (string, error) {
 	}
 	}
 	return "", defaultHostStatus
 	return "", defaultHostStatus
 }
 }
+
+// checkBindURLs returns an error if any URL uses a domain name.
+func checkBindURLs(urls []url.URL) error {
+	for _, url := range urls {
+		if url.Scheme == "unix" || url.Scheme == "unixs" {
+			continue
+		}
+		host := strings.Split(url.Host, ":")[0]
+		if host == "localhost" {
+			// special case for local address
+			// TODO: support /etc/hosts ?
+			continue
+		}
+		if net.ParseIP(host) == nil {
+			return fmt.Errorf("expected IP in URL for binding (%s)", url.String())
+		}
+	}
+	return nil
+}