conn: remove scope when sanity checking IP address format

This commit is contained in:
Jason A. Donenfeld 2019-05-09 15:33:57 +02:00
parent dcb8f1aa6b
commit 586112b5d7

View File

@ -10,6 +10,7 @@ import (
"golang.org/x/net/ipv4" "golang.org/x/net/ipv4"
"golang.org/x/net/ipv6" "golang.org/x/net/ipv6"
"net" "net"
"strings"
) )
const ( const (
@ -41,13 +42,18 @@ type Endpoint interface {
} }
func parseEndpoint(s string) (*net.UDPAddr, error) { func parseEndpoint(s string) (*net.UDPAddr, error) {
// ensure that the host is an IP address // ensure that the host is an IP address
host, _, err := net.SplitHostPort(s) host, _, err := net.SplitHostPort(s)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if i := strings.LastIndexByte(host, '%'); i > 0 && strings.IndexByte(host, ':') >= 0 {
// Remove the scope, if any. ResolveUDPAddr below will use it, but here we're just
// trying to make sure with a small sanity test that this is a real IP address and
// not something that's likely to incur DNS lookups.
host = host[:i]
}
if ip := net.ParseIP(host); ip == nil { if ip := net.ParseIP(host); ip == nil {
return nil, errors.New("Failed to parse IP address: " + host) return nil, errors.New("Failed to parse IP address: " + host)
} }