diff options
Diffstat (limited to 'vendor')
| -rw-r--r-- | vendor/github.com/miekg/dns/acceptfunc.go | 2 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/defaults.go | 41 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/dnssec_keyscan.go | 3 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/edns.go | 3 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/generate.go | 33 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/listen_no_reuseport.go | 10 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/listen_reuseport.go | 30 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/msg.go | 20 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/msg_helpers.go | 50 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/scan.go | 45 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/scan_rr.go | 9 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/server.go | 10 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/svcb.go | 39 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/version.go | 2 | ||||
| -rw-r--r-- | vendor/github.com/miekg/dns/xfr.go | 18 | ||||
| -rw-r--r-- | vendor/modules.txt | 4 | 
16 files changed, 166 insertions, 153 deletions
| diff --git a/vendor/github.com/miekg/dns/acceptfunc.go b/vendor/github.com/miekg/dns/acceptfunc.go index ab2812e33..1a59a854e 100644 --- a/vendor/github.com/miekg/dns/acceptfunc.go +++ b/vendor/github.com/miekg/dns/acceptfunc.go @@ -10,8 +10,6 @@ type MsgAcceptFunc func(dh Header) MsgAcceptAction  //  // * opcode isn't OpcodeQuery or OpcodeNotify  // -// * Zero bit isn't zero -//  // * does not have exactly 1 question in the question section  //  // * has more than 1 RR in the Answer section diff --git a/vendor/github.com/miekg/dns/defaults.go b/vendor/github.com/miekg/dns/defaults.go index 6d7e17605..02d9199a4 100644 --- a/vendor/github.com/miekg/dns/defaults.go +++ b/vendor/github.com/miekg/dns/defaults.go @@ -5,7 +5,6 @@ import (  	"net"  	"strconv"  	"strings" -	"unicode"  )  const hexDigit = "0123456789abcdef" @@ -23,8 +22,7 @@ func (dns *Msg) SetReply(request *Msg) *Msg {  	}  	dns.Rcode = RcodeSuccess  	if len(request.Question) > 0 { -		dns.Question = make([]Question, 1) -		dns.Question[0] = request.Question[0] +		dns.Question = []Question{request.Question[0]}  	}  	return dns  } @@ -293,26 +291,19 @@ func IsFqdn(s string) bool {  	return (len(s)-i)%2 != 0  } -// IsRRset checks if a set of RRs is a valid RRset as defined by RFC 2181. -// This means the RRs need to have the same type, name, and class. Returns true -// if the RR set is valid, otherwise false. +// IsRRset reports whether a set of RRs is a valid RRset as defined by RFC 2181. +// This means the RRs need to have the same type, name, and class.  func IsRRset(rrset []RR) bool {  	if len(rrset) == 0 {  		return false  	} -	if len(rrset) == 1 { -		return true -	} -	rrHeader := rrset[0].Header() -	rrType := rrHeader.Rrtype -	rrClass := rrHeader.Class -	rrName := rrHeader.Name +	baseH := rrset[0].Header()  	for _, rr := range rrset[1:] { -		curRRHeader := rr.Header() -		if curRRHeader.Rrtype != rrType || curRRHeader.Class != rrClass || curRRHeader.Name != rrName { +		curH := rr.Header() +		if curH.Rrtype != baseH.Rrtype || curH.Class != baseH.Class || curH.Name != baseH.Name {  			// Mismatch between the records, so this is not a valid rrset for -			//signing/verifying +			// signing/verifying  			return false  		}  	} @@ -330,19 +321,15 @@ func Fqdn(s string) string {  }  // CanonicalName returns the domain name in canonical form. A name in canonical -// form is lowercase and fully qualified. See Section 6.2 in RFC 4034. -// According to the RFC all uppercase US-ASCII letters in the owner name of the -// RR areeplaced by the corresponding lowercase US-ASCII letters. +// form is lowercase and fully qualified. Only US-ASCII letters are affected. See +// Section 6.2 in RFC 4034.  func CanonicalName(s string) string { -	var result strings.Builder -	for _, ch := range s { -		if unicode.IsUpper(ch) && (ch >= 0x00 && ch <= 0x7F) { -			result.WriteRune(unicode.ToLower(ch)) -		} else { -			result.WriteRune(ch) +	return strings.Map(func(r rune) rune { +		if r >= 'A' && r <= 'Z' { +			r += 'a' - 'A'  		} -	} -	return Fqdn(result.String()) +		return r +	}, Fqdn(s))  }  // Copied from the official Go code. diff --git a/vendor/github.com/miekg/dns/dnssec_keyscan.go b/vendor/github.com/miekg/dns/dnssec_keyscan.go index f79658169..5e72249b5 100644 --- a/vendor/github.com/miekg/dns/dnssec_keyscan.go +++ b/vendor/github.com/miekg/dns/dnssec_keyscan.go @@ -37,7 +37,8 @@ func (k *DNSKEY) ReadPrivateKey(q io.Reader, file string) (crypto.PrivateKey, er  		return nil, ErrPrivKey  	}  	// TODO(mg): check if the pubkey matches the private key -	algo, err := strconv.ParseUint(strings.SplitN(m["algorithm"], " ", 2)[0], 10, 8) +	algoStr, _, _ := strings.Cut(m["algorithm"], " ") +	algo, err := strconv.ParseUint(algoStr, 10, 8)  	if err != nil {  		return nil, ErrPrivKey  	} diff --git a/vendor/github.com/miekg/dns/edns.go b/vendor/github.com/miekg/dns/edns.go index b5bdac816..1b58e8f0a 100644 --- a/vendor/github.com/miekg/dns/edns.go +++ b/vendor/github.com/miekg/dns/edns.go @@ -185,7 +185,7 @@ func (rr *OPT) Do() bool {  // SetDo sets the DO (DNSSEC OK) bit.  // If we pass an argument, set the DO bit to that value. -// It is possible to pass 2 or more arguments. Any arguments after the 1st is silently ignored. +// It is possible to pass 2 or more arguments, but they will be ignored.  func (rr *OPT) SetDo(do ...bool) {  	if len(do) == 1 {  		if do[0] { @@ -508,6 +508,7 @@ func (e *EDNS0_LLQ) String() string {  		" " + strconv.FormatUint(uint64(e.LeaseLife), 10)  	return s  } +  func (e *EDNS0_LLQ) copy() EDNS0 {  	return &EDNS0_LLQ{e.Code, e.Version, e.Opcode, e.Error, e.Id, e.LeaseLife}  } diff --git a/vendor/github.com/miekg/dns/generate.go b/vendor/github.com/miekg/dns/generate.go index ac8df34dd..713e9d2da 100644 --- a/vendor/github.com/miekg/dns/generate.go +++ b/vendor/github.com/miekg/dns/generate.go @@ -35,17 +35,17 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) {  		token = token[:i]  	} -	sx := strings.SplitN(token, "-", 2) -	if len(sx) != 2 { +	startStr, endStr, ok := strings.Cut(token, "-") +	if !ok {  		return zp.setParseError("bad start-stop in $GENERATE range", l)  	} -	start, err := strconv.ParseInt(sx[0], 10, 64) +	start, err := strconv.ParseInt(startStr, 10, 64)  	if err != nil {  		return zp.setParseError("bad start in $GENERATE range", l)  	} -	end, err := strconv.ParseInt(sx[1], 10, 64) +	end, err := strconv.ParseInt(endStr, 10, 64)  	if err != nil {  		return zp.setParseError("bad stop in $GENERATE range", l)  	} @@ -54,7 +54,7 @@ func (zp *ZoneParser) generate(l lex) (RR, bool) {  	}  	// _BLANK -	l, ok := zp.c.Next() +	l, ok = zp.c.Next()  	if !ok || l.value != zBlank {  		return zp.setParseError("garbage after $GENERATE range", l)  	} @@ -211,15 +211,16 @@ func (r *generateReader) ReadByte() (byte, error) {  func modToPrintf(s string) (string, int64, string) {  	// Modifier is { offset [ ,width [ ,base ] ] } - provide default  	// values for optional width and type, if necessary. -	var offStr, widthStr, base string -	switch xs := strings.Split(s, ","); len(xs) { -	case 1: -		offStr, widthStr, base = xs[0], "0", "d" -	case 2: -		offStr, widthStr, base = xs[0], xs[1], "d" -	case 3: -		offStr, widthStr, base = xs[0], xs[1], xs[2] -	default: +	offStr, s, ok0 := strings.Cut(s, ",") +	widthStr, s, ok1 := strings.Cut(s, ",") +	base, _, ok2 := strings.Cut(s, ",") +	if !ok0 { +		widthStr = "0" +	} +	if !ok1 { +		base = "d" +	} +	if ok2 {  		return "", 0, "bad modifier in $GENERATE"  	} @@ -234,8 +235,8 @@ func modToPrintf(s string) (string, int64, string) {  		return "", 0, "bad offset in $GENERATE"  	} -	width, err := strconv.ParseInt(widthStr, 10, 64) -	if err != nil || width < 0 || width > 255 { +	width, err := strconv.ParseUint(widthStr, 10, 8) +	if err != nil {  		return "", 0, "bad width in $GENERATE"  	} diff --git a/vendor/github.com/miekg/dns/listen_no_reuseport.go b/vendor/github.com/miekg/dns/listen_no_reuseport.go index 6ed50f86b..8cebb2f17 100644 --- a/vendor/github.com/miekg/dns/listen_no_reuseport.go +++ b/vendor/github.com/miekg/dns/listen_no_reuseport.go @@ -7,16 +7,18 @@ import "net"  const supportsReusePort = false -func listenTCP(network, addr string, reuseport bool) (net.Listener, error) { -	if reuseport { +func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) { +	if reuseport || reuseaddr {  		// TODO(tmthrgd): return an error?  	}  	return net.Listen(network, addr)  } -func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) { -	if reuseport { +const supportsReuseAddr = false + +func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { +	if reuseport || reuseaddr {  		// TODO(tmthrgd): return an error?  	} diff --git a/vendor/github.com/miekg/dns/listen_reuseport.go b/vendor/github.com/miekg/dns/listen_reuseport.go index 89bac9034..41326f20b 100644 --- a/vendor/github.com/miekg/dns/listen_reuseport.go +++ b/vendor/github.com/miekg/dns/listen_reuseport.go @@ -25,19 +25,41 @@ func reuseportControl(network, address string, c syscall.RawConn) error {  	return opErr  } -func listenTCP(network, addr string, reuseport bool) (net.Listener, error) { +const supportsReuseAddr = true + +func reuseaddrControl(network, address string, c syscall.RawConn) error { +	var opErr error +	err := c.Control(func(fd uintptr) { +		opErr = unix.SetsockoptInt(int(fd), unix.SOL_SOCKET, unix.SO_REUSEADDR, 1) +	}) +	if err != nil { +		return err +	} + +	return opErr +} + +func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) {  	var lc net.ListenConfig -	if reuseport { +	switch { +	case reuseaddr && reuseport: +	case reuseport:  		lc.Control = reuseportControl +	case reuseaddr: +		lc.Control = reuseaddrControl  	}  	return lc.Listen(context.Background(), network, addr)  } -func listenUDP(network, addr string, reuseport bool) (net.PacketConn, error) { +func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) {  	var lc net.ListenConfig -	if reuseport { +	switch { +	case reuseaddr && reuseport: +	case reuseport:  		lc.Control = reuseportControl +	case reuseaddr: +		lc.Control = reuseaddrControl  	}  	return lc.ListenPacket(context.Background(), network, addr) diff --git a/vendor/github.com/miekg/dns/msg.go b/vendor/github.com/miekg/dns/msg.go index b05cf14e9..8294d0395 100644 --- a/vendor/github.com/miekg/dns/msg.go +++ b/vendor/github.com/miekg/dns/msg.go @@ -501,30 +501,28 @@ func packTxtString(s string, msg []byte, offset int) (int, error) {  	return offset, nil  } -func packOctetString(s string, msg []byte, offset int, tmp []byte) (int, error) { -	if offset >= len(msg) || len(s) > len(tmp) { +func packOctetString(s string, msg []byte, offset int) (int, error) { +	if offset >= len(msg) || len(s) > 256*4+1 {  		return offset, ErrBuf  	} -	bs := tmp[:len(s)] -	copy(bs, s) -	for i := 0; i < len(bs); i++ { +	for i := 0; i < len(s); i++ {  		if len(msg) <= offset {  			return offset, ErrBuf  		} -		if bs[i] == '\\' { +		if s[i] == '\\' {  			i++ -			if i == len(bs) { +			if i == len(s) {  				break  			}  			// check for \DDD -			if isDDD(bs[i:]) { -				msg[offset] = dddToByte(bs[i:]) +			if isDDD(s[i:]) { +				msg[offset] = dddToByte(s[i:])  				i += 2  			} else { -				msg[offset] = bs[i] +				msg[offset] = s[i]  			}  		} else { -			msg[offset] = bs[i] +			msg[offset] = s[i]  		}  		offset++  	} diff --git a/vendor/github.com/miekg/dns/msg_helpers.go b/vendor/github.com/miekg/dns/msg_helpers.go index 8582fc0ad..acec21f7d 100644 --- a/vendor/github.com/miekg/dns/msg_helpers.go +++ b/vendor/github.com/miekg/dns/msg_helpers.go @@ -20,9 +20,7 @@ func unpackDataA(msg []byte, off int) (net.IP, int, error) {  	if off+net.IPv4len > len(msg) {  		return nil, len(msg), &Error{err: "overflow unpacking a"}  	} -	a := append(make(net.IP, 0, net.IPv4len), msg[off:off+net.IPv4len]...) -	off += net.IPv4len -	return a, off, nil +	return cloneSlice(msg[off : off+net.IPv4len]), off + net.IPv4len, nil  }  func packDataA(a net.IP, msg []byte, off int) (int, error) { @@ -47,9 +45,7 @@ func unpackDataAAAA(msg []byte, off int) (net.IP, int, error) {  	if off+net.IPv6len > len(msg) {  		return nil, len(msg), &Error{err: "overflow unpacking aaaa"}  	} -	aaaa := append(make(net.IP, 0, net.IPv6len), msg[off:off+net.IPv6len]...) -	off += net.IPv6len -	return aaaa, off, nil +	return cloneSlice(msg[off : off+net.IPv6len]), off + net.IPv6len, nil  }  func packDataAAAA(aaaa net.IP, msg []byte, off int) (int, error) { @@ -410,29 +406,24 @@ func packStringTxt(s []string, msg []byte, off int) (int, error) {  func unpackDataOpt(msg []byte, off int) ([]EDNS0, int, error) {  	var edns []EDNS0 -Option: -	var code uint16 -	if off+4 > len(msg) { -		return nil, len(msg), &Error{err: "overflow unpacking opt"} -	} -	code = binary.BigEndian.Uint16(msg[off:]) -	off += 2 -	optlen := binary.BigEndian.Uint16(msg[off:]) -	off += 2 -	if off+int(optlen) > len(msg) { -		return nil, len(msg), &Error{err: "overflow unpacking opt"} -	} -	e := makeDataOpt(code) -	if err := e.unpack(msg[off : off+int(optlen)]); err != nil { -		return nil, len(msg), err -	} -	edns = append(edns, e) -	off += int(optlen) - -	if off < len(msg) { -		goto Option +	for off < len(msg) { +		if off+4 > len(msg) { +			return nil, len(msg), &Error{err: "overflow unpacking opt"} +		} +		code := binary.BigEndian.Uint16(msg[off:]) +		off += 2 +		optlen := binary.BigEndian.Uint16(msg[off:]) +		off += 2 +		if off+int(optlen) > len(msg) { +			return nil, len(msg), &Error{err: "overflow unpacking opt"} +		} +		opt := makeDataOpt(code) +		if err := opt.unpack(msg[off : off+int(optlen)]); err != nil { +			return nil, len(msg), err +		} +		edns = append(edns, opt) +		off += int(optlen)  	} -  	return edns, off, nil  } @@ -461,8 +452,7 @@ func unpackStringOctet(msg []byte, off int) (string, int, error) {  }  func packStringOctet(s string, msg []byte, off int) (int, error) { -	txtTmp := make([]byte, 256*4+1) -	off, err := packOctetString(s, msg, off, txtTmp) +	off, err := packOctetString(s, msg, off)  	if err != nil {  		return len(msg), err  	} diff --git a/vendor/github.com/miekg/dns/scan.go b/vendor/github.com/miekg/dns/scan.go index 3083c3e5f..062d8ff3a 100644 --- a/vendor/github.com/miekg/dns/scan.go +++ b/vendor/github.com/miekg/dns/scan.go @@ -605,8 +605,6 @@ func (zp *ZoneParser) Next() (RR, bool) {  			if !isPrivate && zp.c.Peek().token == "" {  				// This is a dynamic update rr. -				// TODO(tmthrgd): Previously slurpRemainder was only called -				// for certain RR types, which may have been important.  				if err := slurpRemainder(zp.c); err != nil {  					return zp.setParseError(err.err, err.lex)  				} @@ -1216,42 +1214,34 @@ func stringToCm(token string) (e, m uint8, ok bool) {  	if token[len(token)-1] == 'M' || token[len(token)-1] == 'm' {  		token = token[0 : len(token)-1]  	} -	s := strings.SplitN(token, ".", 2) -	var meters, cmeters, val int -	var err error -	switch len(s) { -	case 2: -		if cmeters, err = strconv.Atoi(s[1]); err != nil { -			return -		} + +	var ( +		meters, cmeters, val int +		err                  error +	) +	mStr, cmStr, hasCM := strings.Cut(token, ".") +	if hasCM {  		// There's no point in having more than 2 digits in this part, and would rather make the implementation complicated ('123' should be treated as '12').  		// So we simply reject it.  		// We also make sure the first character is a digit to reject '+-' signs. -		if len(s[1]) > 2 || s[1][0] < '0' || s[1][0] > '9' { +		cmeters, err = strconv.Atoi(cmStr) +		if err != nil || len(cmStr) > 2 || cmStr[0] < '0' || cmStr[0] > '9' {  			return  		} -		if len(s[1]) == 1 { +		if len(cmStr) == 1 {  			// 'nn.1' must be treated as 'nn-meters and 10cm, not 1cm.  			cmeters *= 10  		} -		if s[0] == "" { -			// This will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). -			break -		} -		fallthrough -	case 1: -		if meters, err = strconv.Atoi(s[0]); err != nil { -			return -		} +	} +	// This slighly ugly condition will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). +	if !hasCM || mStr != "" { +		meters, err = strconv.Atoi(mStr)  		// RFC1876 states the max value is 90000000.00.  The latter two conditions enforce it. -		if s[0][0] < '0' || s[0][0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) { +		if err != nil || mStr[0] < '0' || mStr[0] > '9' || meters > 90000000 || (meters == 90000000 && cmeters != 0) {  			return  		} -	case 0: -		// huh? -		return 0, 0, false  	} -	ok = true +  	if meters > 0 {  		e = 2  		val = meters @@ -1263,8 +1253,7 @@ func stringToCm(token string) (e, m uint8, ok bool) {  		e++  		val /= 10  	} -	m = uint8(val) -	return +	return e, uint8(val), true  }  func toAbsoluteName(name, origin string) (absolute string, ok bool) { diff --git a/vendor/github.com/miekg/dns/scan_rr.go b/vendor/github.com/miekg/dns/scan_rr.go index d08c8e6a7..a635e1c5c 100644 --- a/vendor/github.com/miekg/dns/scan_rr.go +++ b/vendor/github.com/miekg/dns/scan_rr.go @@ -1,7 +1,6 @@  package dns  import ( -	"bytes"  	"encoding/base64"  	"errors"  	"net" @@ -12,15 +11,15 @@ import (  // A remainder of the rdata with embedded spaces, return the parsed string (sans the spaces)  // or an error  func endingToString(c *zlexer, errstr string) (string, *ParseError) { -	var buffer bytes.Buffer +	var s strings.Builder  	l, _ := c.Next() // zString  	for l.value != zNewline && l.value != zEOF {  		if l.err { -			return buffer.String(), &ParseError{"", errstr, l} +			return s.String(), &ParseError{"", errstr, l}  		}  		switch l.value {  		case zString: -			buffer.WriteString(l.token) +			s.WriteString(l.token)  		case zBlank: // Ok  		default:  			return "", &ParseError{"", errstr, l} @@ -28,7 +27,7 @@ func endingToString(c *zlexer, errstr string) (string, *ParseError) {  		l, _ = c.Next()  	} -	return buffer.String(), nil +	return s.String(), nil  }  // A remainder of the rdata with embedded spaces, split on unquoted whitespace diff --git a/vendor/github.com/miekg/dns/server.go b/vendor/github.com/miekg/dns/server.go index 64e388546..0207d6da2 100644 --- a/vendor/github.com/miekg/dns/server.go +++ b/vendor/github.com/miekg/dns/server.go @@ -226,6 +226,10 @@ type Server struct {  	// Whether to set the SO_REUSEPORT socket option, allowing multiple listeners to be bound to a single address.  	// It is only supported on certain GOOSes and when using ListenAndServe.  	ReusePort bool +	// Whether to set the SO_REUSEADDR socket option, allowing multiple listeners to be bound to a single address. +	// Crucially this allows binding when an existing server is listening on `0.0.0.0` or `::`. +	// It is only supported on certain GOOSes and when using ListenAndServe. +	ReuseAddr bool  	// AcceptMsgFunc will check the incoming message and will reject it early in the process.  	// By default DefaultMsgAcceptFunc will be used.  	MsgAcceptFunc MsgAcceptFunc @@ -304,7 +308,7 @@ func (srv *Server) ListenAndServe() error {  	switch srv.Net {  	case "tcp", "tcp4", "tcp6": -		l, err := listenTCP(srv.Net, addr, srv.ReusePort) +		l, err := listenTCP(srv.Net, addr, srv.ReusePort, srv.ReuseAddr)  		if err != nil {  			return err  		} @@ -317,7 +321,7 @@ func (srv *Server) ListenAndServe() error {  			return errors.New("dns: neither Certificates nor GetCertificate set in Config")  		}  		network := strings.TrimSuffix(srv.Net, "-tls") -		l, err := listenTCP(network, addr, srv.ReusePort) +		l, err := listenTCP(network, addr, srv.ReusePort, srv.ReuseAddr)  		if err != nil {  			return err  		} @@ -327,7 +331,7 @@ func (srv *Server) ListenAndServe() error {  		unlock()  		return srv.serveTCP(l)  	case "udp", "udp4", "udp6": -		l, err := listenUDP(srv.Net, addr, srv.ReusePort) +		l, err := listenUDP(srv.Net, addr, srv.ReusePort, srv.ReuseAddr)  		if err != nil {  			return err  		} diff --git a/vendor/github.com/miekg/dns/svcb.go b/vendor/github.com/miekg/dns/svcb.go index 6d496d74d..d38aa2f05 100644 --- a/vendor/github.com/miekg/dns/svcb.go +++ b/vendor/github.com/miekg/dns/svcb.go @@ -314,10 +314,11 @@ func (s *SVCBMandatory) unpack(b []byte) error {  }  func (s *SVCBMandatory) parse(b string) error { -	str := strings.Split(b, ",") -	codes := make([]SVCBKey, 0, len(str)) -	for _, e := range str { -		codes = append(codes, svcbStringToKey(e)) +	codes := make([]SVCBKey, 0, strings.Count(b, ",")+1) +	for len(b) > 0 { +		var key string +		key, b, _ = strings.Cut(b, ",") +		codes = append(codes, svcbStringToKey(key))  	}  	s.Code = codes  	return nil @@ -613,19 +614,24 @@ func (s *SVCBIPv4Hint) String() string {  }  func (s *SVCBIPv4Hint) parse(b string) error { +	if b == "" { +		return errors.New("dns: svcbipv4hint: empty hint") +	}  	if strings.Contains(b, ":") {  		return errors.New("dns: svcbipv4hint: expected ipv4, got ipv6")  	} -	str := strings.Split(b, ",") -	dst := make([]net.IP, len(str)) -	for i, e := range str { + +	hint := make([]net.IP, 0, strings.Count(b, ",")+1) +	for len(b) > 0 { +		var e string +		e, b, _ = strings.Cut(b, ",")  		ip := net.ParseIP(e).To4()  		if ip == nil {  			return errors.New("dns: svcbipv4hint: bad ip")  		} -		dst[i] = ip +		hint = append(hint, ip)  	} -	s.Hint = dst +	s.Hint = hint  	return nil  } @@ -733,9 +739,14 @@ func (s *SVCBIPv6Hint) String() string {  }  func (s *SVCBIPv6Hint) parse(b string) error { -	str := strings.Split(b, ",") -	dst := make([]net.IP, len(str)) -	for i, e := range str { +	if b == "" { +		return errors.New("dns: svcbipv6hint: empty hint") +	} + +	hint := make([]net.IP, 0, strings.Count(b, ",")+1) +	for len(b) > 0 { +		var e string +		e, b, _ = strings.Cut(b, ",")  		ip := net.ParseIP(e)  		if ip == nil {  			return errors.New("dns: svcbipv6hint: bad ip") @@ -743,9 +754,9 @@ func (s *SVCBIPv6Hint) parse(b string) error {  		if ip.To4() != nil {  			return errors.New("dns: svcbipv6hint: expected ipv6, got ipv4-mapped-ipv6")  		} -		dst[i] = ip +		hint = append(hint, ip)  	} -	s.Hint = dst +	s.Hint = hint  	return nil  } diff --git a/vendor/github.com/miekg/dns/version.go b/vendor/github.com/miekg/dns/version.go index a09113662..9fd300f66 100644 --- a/vendor/github.com/miekg/dns/version.go +++ b/vendor/github.com/miekg/dns/version.go @@ -3,7 +3,7 @@ package dns  import "fmt"  // Version is current version of this library. -var Version = v{1, 1, 56} +var Version = v{1, 1, 57}  // v holds the version of this library.  type v struct { diff --git a/vendor/github.com/miekg/dns/xfr.go b/vendor/github.com/miekg/dns/xfr.go index 0a831c880..05b3c5add 100644 --- a/vendor/github.com/miekg/dns/xfr.go +++ b/vendor/github.com/miekg/dns/xfr.go @@ -80,8 +80,13 @@ func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) {  func (t *Transfer) inAxfr(q *Msg, c chan *Envelope) {  	first := true -	defer t.Close() -	defer close(c) +	defer func() { +		// First close the connection, then the channel. This allows functions blocked on +		// the channel to assume that the connection is closed and no further operations are +		// pending when they resume. +		t.Close() +		close(c) +	}()  	timeout := dnsTimeout  	if t.ReadTimeout != 0 {  		timeout = t.ReadTimeout @@ -131,8 +136,13 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) {  	axfr := true  	n := 0  	qser := q.Ns[0].(*SOA).Serial -	defer t.Close() -	defer close(c) +	defer func() { +		// First close the connection, then the channel. This allows functions blocked on +		// the channel to assume that the connection is closed and no further operations are +		// pending when they resume. +		t.Close() +		close(c) +	}()  	timeout := dnsTimeout  	if t.ReadTimeout != 0 {  		timeout = t.ReadTimeout diff --git a/vendor/modules.txt b/vendor/modules.txt index 10b9fac0c..3733bb649 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -376,7 +376,7 @@ github.com/matttproud/golang_protobuf_extensions/pbutil  ## explicit; go 1.21  github.com/microcosm-cc/bluemonday  github.com/microcosm-cc/bluemonday/css -# github.com/miekg/dns v1.1.56 +# github.com/miekg/dns v1.1.57  ## explicit; go 1.19  github.com/miekg/dns  # github.com/minio/md5-simd v1.1.2 @@ -905,7 +905,7 @@ golang.org/x/net/trace  ## explicit; go 1.18  golang.org/x/oauth2  golang.org/x/oauth2/internal -# golang.org/x/sync v0.3.0 +# golang.org/x/sync v0.4.0  ## explicit; go 1.17  golang.org/x/sync/semaphore  # golang.org/x/sys v0.15.0 | 
