@@ -55,6 +55,19 @@ func (p *AddressParser) readPort(b *buf.Buffer, reader io.Reader) (net.Port, err
return net.PortFromBytes(b.BytesFrom(-2)), nil
}
+func maybeIPPrefix(b byte) bool {
+ return b == '[' || (b >= '0' && b <= '9')
+}
+
+func isValidDomain(d string) bool {
+ for _, c := range d {
+ if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || c == '.') {
+ return false
+ }
+ return true
func (p *AddressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Address, error) {
if err := b.AppendSupplier(buf.ReadFullFrom(reader, 1)); err != nil {
return nil, err
@@ -89,7 +102,17 @@ func (p *AddressParser) readAddress(b *buf.Buffer, reader io.Reader) (net.Addres
if err := b.AppendSupplier(buf.ReadFullFrom(reader, domainLength)); err != nil {
- return net.DomainAddress(string(b.BytesFrom(-domainLength))), nil
+ domain := string(b.BytesFrom(-domainLength))
+ if maybeIPPrefix(domain[0]) {
+ addr := net.ParseAddress(domain)
+ if addr.Family().IsIPv4() || addrFamily.IsIPv6() {
+ return addr, nil
+ if !isValidDomain(domain) {
+ return nil, newError("invalid domain name: ", domain)
+ return net.DomainAddress(domain), nil
default:
panic("impossible case")
@@ -58,6 +58,17 @@ func TestAddressReading(t *testing.T) {
Input: []byte{3, 9, 118, 50, 114, 97, 121, 46, 99, 111, 109, 0},
Error: true,
},
+ {
+ Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)},
+ Input: []byte{3, 7, 56, 46, 56, 46, 56, 46, 56, 0, 80},
+ Address: net.ParseAddress("8.8.8.8"),
+ Port: net.Port(80),
+ },
+ Input: []byte{3, 7, 10, 46, 56, 46, 56, 46, 56, 0, 80},
+ Error: true,
for _, tc := range data {