fix(dns): sigsegv on unreachable
This commit is contained in:
		
							parent
							
								
									d24dd52975
								
							
						
					
					
						commit
						2ba85969d6
					
				
							
								
								
									
										7
									
								
								dns.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								dns.go
									
									
									
									
									
								
							@ -3,6 +3,7 @@ package main
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"crypto/tls"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"net"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
@ -10,6 +11,10 @@ import (
 | 
			
		||||
	"github.com/fumiama/terasu"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrNoDNSAvailable = errors.New("no dns available")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var dnsdialer = net.Dialer{
 | 
			
		||||
	Timeout: time.Second * 8,
 | 
			
		||||
}
 | 
			
		||||
@ -51,6 +56,8 @@ func (ds *dnsservers) add(m map[string][]string) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ds *dnsservers) dial(ctx context.Context) (tlsConn *tls.Conn, err error) {
 | 
			
		||||
	err = ErrNoDNSAvailable
 | 
			
		||||
 | 
			
		||||
	ds.RLock()
 | 
			
		||||
	defer ds.RUnlock()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										39
									
								
								dns_test.go
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								dns_test.go
									
									
									
									
									
								
							@ -6,17 +6,21 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/fumiama/terasu"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestResolver(t *testing.T) {
 | 
			
		||||
	t.Log("canUseIPv6:", canUseIPv6.Get())
 | 
			
		||||
	addrs, err := resolver.LookupHost(context.TODO(), "dns.google")
 | 
			
		||||
	addrs, err := resolver.LookupHost(context.TODO(), "api.mangacopy.com")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	t.Log(addrs)
 | 
			
		||||
	if len(addrs) == 0 {
 | 
			
		||||
		t.Fail()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDNS(t *testing.T) {
 | 
			
		||||
@ -24,6 +28,39 @@ func TestDNS(t *testing.T) {
 | 
			
		||||
		dotv6servers.test()
 | 
			
		||||
	}
 | 
			
		||||
	dotv4servers.test()
 | 
			
		||||
	for i := 0; i < 100; i++ {
 | 
			
		||||
		addrs, err := resolver.LookupHost(context.TODO(), "api.mangacopy.com")
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		t.Log(addrs)
 | 
			
		||||
		if len(addrs) == 0 {
 | 
			
		||||
			t.Fail()
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(time.Millisecond * 50)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestBadDNS(t *testing.T) {
 | 
			
		||||
	if canUseIPv6.Get() {
 | 
			
		||||
		dotv6servers = dnsservers{
 | 
			
		||||
			m: map[string][]*dnsstat{},
 | 
			
		||||
		}
 | 
			
		||||
		dotv6servers.add(map[string][]string{"test.bad.host": {"169.254.122.111"}})
 | 
			
		||||
	} else {
 | 
			
		||||
		dotv4servers = dnsservers{
 | 
			
		||||
			m: map[string][]*dnsstat{},
 | 
			
		||||
		}
 | 
			
		||||
		dotv4servers.add(map[string][]string{"test.bad.host": {"169.254.122.111:853"}})
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < 10; i++ {
 | 
			
		||||
		addrs, err := resolver.LookupHost(context.TODO(), "api.mangacopy.com")
 | 
			
		||||
		t.Log(err)
 | 
			
		||||
		if err == nil && len(addrs) > 0 {
 | 
			
		||||
			t.Fatal("unexpected")
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(time.Millisecond * 50)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ds *dnsservers) test() {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								http.go
									
									
									
									
									
								
							@ -20,6 +20,10 @@ import (
 | 
			
		||||
	"golang.org/x/net/http2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	ErrEmptyHostAddress = errors.New("empty host addr")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var httpdialer = net.Dialer{
 | 
			
		||||
	Timeout: time.Minute,
 | 
			
		||||
}
 | 
			
		||||
@ -56,7 +60,7 @@ var cli = comandyClient(http.Client{
 | 
			
		||||
				lookupTable.Set(host, addrs)
 | 
			
		||||
			}
 | 
			
		||||
			if len(addr) == 0 {
 | 
			
		||||
				return nil, errors.New("empty host addr")
 | 
			
		||||
				return nil, ErrEmptyHostAddress
 | 
			
		||||
			}
 | 
			
		||||
			var tlsConn *tls.Conn
 | 
			
		||||
			for _, a := range addrs {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user