From 70c8bb19a7db2f270b2130c62eafb1cabef42ff0 Mon Sep 17 00:00:00 2001 From: Kr328 <39107975+Kr328@users.noreply.github.com> Date: Sat, 30 Nov 2019 01:58:06 +0800 Subject: [PATCH] fix buffer & dns nil --- core/src/main/golang/tun/dnsredirect.go | 15 ++++++++++++--- core/src/main/golang/tun/tun.go | 6 +++++- .../com/github/kr328/clash/service/TunService.kt | 5 ++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/core/src/main/golang/tun/dnsredirect.go b/core/src/main/golang/tun/dnsredirect.go index 2133257..3680f02 100644 --- a/core/src/main/golang/tun/dnsredirect.go +++ b/core/src/main/golang/tun/dnsredirect.go @@ -4,6 +4,7 @@ import ( "net" "time" + "github.com/Dreamacro/clash/common/pool" "github.com/google/netstack/tcpip/adapters/gonet" "github.com/google/netstack/tcpip/buffer" "github.com/google/netstack/tcpip/stack" @@ -24,9 +25,11 @@ func NewDnsRedirect(s *stack.Stack) *DnsRedirectEndpoint { result := &DnsRedirectEndpoint{ stack: s, udpForwarder: nil, - targetAddr: &net.UDPAddr{IP: net.ParseIP("8.8.8.8"), Port: 53}, + targetAddr: nil, } + result.SetDefaultTargetAddress() + result.udpForwarder = udp.NewForwarder(s, func(request *udp.ForwarderRequest) { var wq waiter.Queue ep, err := request.CreateEndpoint(&wq) @@ -44,7 +47,8 @@ func NewDnsRedirect(s *stack.Stack) *DnsRedirectEndpoint { // send go func() { - var buffer [128]byte + buffer := pool.BufPool.Get().([]byte) + defer pool.BufPool.Put(buffer[:cap(buffer)]) defer targetConn.Close() defer conn.Close() @@ -66,7 +70,8 @@ func NewDnsRedirect(s *stack.Stack) *DnsRedirectEndpoint { // receive go func() { - var buffer [128]byte + buffer := pool.BufPool.Get().([]byte) + defer pool.BufPool.Put(buffer[:cap(buffer)]) defer targetConn.Close() defer conn.Close() @@ -90,6 +95,10 @@ func NewDnsRedirect(s *stack.Stack) *DnsRedirectEndpoint { return result } +func (d *DnsRedirectEndpoint) SetDefaultTargetAddress() { + d.targetAddr = &net.UDPAddr{IP: net.ParseIP(defaultDNS), Port: 53} +} + func (d *DnsRedirectEndpoint) SetTargetAddress(addr *net.UDPAddr) { d.targetAddr = addr } diff --git a/core/src/main/golang/tun/tun.go b/core/src/main/golang/tun/tun.go index 923338e..6818abc 100644 --- a/core/src/main/golang/tun/tun.go +++ b/core/src/main/golang/tun/tun.go @@ -77,5 +77,9 @@ func SetDNSRedirect(addr *net.UDPAddr) { return } - instance.dnsRedirect.SetTargetAddress(addr) + if addr != nil { + instance.dnsRedirect.SetTargetAddress(addr) + } else { + instance.dnsRedirect.SetDefaultTargetAddress() + } } diff --git a/service/src/main/java/com/github/kr328/clash/service/TunService.kt b/service/src/main/java/com/github/kr328/clash/service/TunService.kt index fae7e29..9b1f2f0 100644 --- a/service/src/main/java/com/github/kr328/clash/service/TunService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/TunService.kt @@ -100,7 +100,10 @@ class TunService : VpnService(), IClashEventObserver { override fun onProcessEvent(event: ProcessEvent?) { when (event) { ProcessEvent.STOPPED -> { - if (start) + val startNow = start + start = false + + if (startNow) clash.start() else stopSelf()