Skip to content

Commit 675fd28

Browse files
authored
fix(dns): leak on fallback (#9)
1 parent f6d6538 commit 675fd28

File tree

1 file changed

+7
-18
lines changed

1 file changed

+7
-18
lines changed

lib/dns/dns.go

+7-18
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func Init() {
3535
DefaultClient = &dns.Client{
3636
Dialer: &net.Dialer{
3737
Resolver: &net.Resolver{
38+
PreferGo: true,
3839
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
3940
return net.Dial(network, RoaFinder)
4041
},
@@ -49,7 +50,7 @@ var ResolveUDPAddr = func(network string, addr string) (*net.UDPAddr, error) {
4950
return nil, fmt.Errorf("split host port failed: %w", err)
5051
}
5152

52-
numport, err := strconv.Atoi(port)
53+
numPort, err := strconv.Atoi(port)
5354
if err != nil {
5455
return nil, fmt.Errorf("parse port failed: %w", err)
5556
}
@@ -58,7 +59,7 @@ var ResolveUDPAddr = func(network string, addr string) (*net.UDPAddr, error) {
5859
if err != nil {
5960
return nil, fmt.Errorf("resolve ip addr failed: %w", err)
6061
}
61-
return &net.UDPAddr{IP: ip, Port: numport}, nil
62+
return &net.UDPAddr{IP: ip, Port: numPort}, nil
6263
}
6364

6465
func resolveIPAddr(addr string) (net.IP, error) {
@@ -74,11 +75,7 @@ func resolveIPAddr(addr string) (net.IP, error) {
7475
}); err != nil {
7576
// fallback
7677
log.Warn().Msgf("directDNS failed: %v", err)
77-
ip, err := net.ResolveIPAddr("ip", addr)
78-
if err != nil {
79-
return nil, fmt.Errorf("fallback failed: %w", err)
80-
}
81-
return ip.IP, nil
78+
return nil, fmt.Errorf("resolve ip addr failed: %w", err)
8279
}
8380

8481
return ip, nil
@@ -87,16 +84,6 @@ func resolveIPAddr(addr string) (net.IP, error) {
8784
func directDNS(addr string) (net.IP, error) {
8885
addr = dns.Fqdn(addr)
8986
msg := new(dns.Msg)
90-
msg.SetQuestion(addr, dns.TypeCNAME)
91-
rec, _, err := DefaultClient.Exchange(msg, RoaFinder)
92-
if err != nil {
93-
return nil, fmt.Errorf("write msg failed: %w", err)
94-
}
95-
for _, ans := range rec.Answer {
96-
if a, ok := ans.(*dns.CNAME); ok {
97-
return directDNS(a.Target)
98-
}
99-
}
10087

10188
var NsServer string
10289
for fa := addr; dns.Split(fa) != nil; {
@@ -112,6 +99,8 @@ func directDNS(addr string) (net.IP, error) {
11299
NsServer = a.Ns
113100
case *dns.NS:
114101
NsServer = a.Ns
102+
case *dns.CNAME:
103+
return directDNS(a.Target)
115104
}
116105
}
117106

@@ -124,7 +113,7 @@ func directDNS(addr string) (net.IP, error) {
124113

125114
nsAddr := net.JoinHostPort(NsServer, "53")
126115
msg.SetQuestion(dns.Fqdn(addr), dns.TypeA)
127-
rec, _, err = DefaultClient.Exchange(msg, nsAddr)
116+
rec, _, err := DefaultClient.Exchange(msg, nsAddr)
128117
if err == nil {
129118
for _, ans := range rec.Answer {
130119
if a, ok := ans.(*dns.A); ok {

0 commit comments

Comments
 (0)