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 ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"crypto/tls" | 	"crypto/tls" | ||||||
|  | 	"errors" | ||||||
| 	"net" | 	"net" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
| @ -10,6 +11,10 @@ import ( | |||||||
| 	"github.com/fumiama/terasu" | 	"github.com/fumiama/terasu" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrNoDNSAvailable = errors.New("no dns available") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| var dnsdialer = net.Dialer{ | var dnsdialer = net.Dialer{ | ||||||
| 	Timeout: time.Second * 8, | 	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) { | func (ds *dnsservers) dial(ctx context.Context) (tlsConn *tls.Conn, err error) { | ||||||
|  | 	err = ErrNoDNSAvailable | ||||||
|  | 
 | ||||||
| 	ds.RLock() | 	ds.RLock() | ||||||
| 	defer ds.RUnlock() | 	defer ds.RUnlock() | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										39
									
								
								dns_test.go
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								dns_test.go
									
									
									
									
									
								
							| @ -6,17 +6,21 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net" | 	"net" | ||||||
| 	"testing" | 	"testing" | ||||||
|  | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/fumiama/terasu" | 	"github.com/fumiama/terasu" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestResolver(t *testing.T) { | func TestResolver(t *testing.T) { | ||||||
| 	t.Log("canUseIPv6:", canUseIPv6.Get()) | 	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 { | 	if err != nil { | ||||||
| 		t.Fatal(err) | 		t.Fatal(err) | ||||||
| 	} | 	} | ||||||
| 	t.Log(addrs) | 	t.Log(addrs) | ||||||
|  | 	if len(addrs) == 0 { | ||||||
|  | 		t.Fail() | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestDNS(t *testing.T) { | func TestDNS(t *testing.T) { | ||||||
| @ -24,6 +28,39 @@ func TestDNS(t *testing.T) { | |||||||
| 		dotv6servers.test() | 		dotv6servers.test() | ||||||
| 	} | 	} | ||||||
| 	dotv4servers.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() { | func (ds *dnsservers) test() { | ||||||
|  | |||||||
							
								
								
									
										6
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								http.go
									
									
									
									
									
								
							| @ -20,6 +20,10 @@ import ( | |||||||
| 	"golang.org/x/net/http2" | 	"golang.org/x/net/http2" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var ( | ||||||
|  | 	ErrEmptyHostAddress = errors.New("empty host addr") | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| var httpdialer = net.Dialer{ | var httpdialer = net.Dialer{ | ||||||
| 	Timeout: time.Minute, | 	Timeout: time.Minute, | ||||||
| } | } | ||||||
| @ -56,7 +60,7 @@ var cli = comandyClient(http.Client{ | |||||||
| 				lookupTable.Set(host, addrs) | 				lookupTable.Set(host, addrs) | ||||||
| 			} | 			} | ||||||
| 			if len(addr) == 0 { | 			if len(addr) == 0 { | ||||||
| 				return nil, errors.New("empty host addr") | 				return nil, ErrEmptyHostAddress | ||||||
| 			} | 			} | ||||||
| 			var tlsConn *tls.Conn | 			var tlsConn *tls.Conn | ||||||
| 			for _, a := range addrs { | 			for _, a := range addrs { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user