mirror of https://github.com/v2ray/v2ray-core
				
				
				
			try parse domain address as IP. fixes #894.
							parent
							
								
									bdab1af29a
								
							
						
					
					
						commit
						a7d467992d
					
				| 
						 | 
				
			
			@ -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")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue