浏览代码

try parse domain address as IP. fixes #894.

Darien Raymond 7 年之前
父节点
当前提交
a7d467992d
共有 2 个文件被更改,包括 35 次插入1 次删除
  1. 24 1
      common/protocol/address.go
  2. 11 0
      common/protocol/address_test.go

+ 24 - 1
common/protocol/address.go

@@ -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 nil, err
 		}
-		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")
 	}

+ 11 - 0
common/protocol/address_test.go

@@ -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),
+		},
+		{
+			Options: []AddressOption{AddressFamilyByte(0x03, net.AddressFamilyDomain)},
+			Input:   []byte{3, 7, 10, 46, 56, 46, 56, 46, 56, 0, 80},
+			Error:   true,
+		},
 	}
 
 	for _, tc := range data {