From 6e22c004f61e3f4915202167908e3a8026797152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Thu, 2 Mar 2023 00:18:35 +0800 Subject: [PATCH] Improve server error handling --- cmd/internal/build_libbox/main.go | 2 +- common/proxyproto/listener.go | 22 ++++++++++++++++++++-- inbound/default.go | 5 +++++ inbound/default_tcp.go | 11 +++++++++-- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/cmd/internal/build_libbox/main.go b/cmd/internal/build_libbox/main.go index d49dc148..194aa916 100644 --- a/cmd/internal/build_libbox/main.go +++ b/cmd/internal/build_libbox/main.go @@ -6,7 +6,7 @@ import ( "os/exec" "path/filepath" - _ "github.com/sagernet/gomobile/asset" + _ "github.com/sagernet/gomobile/event/key" "github.com/sagernet/sing-box/cmd/internal/build_shared" "github.com/sagernet/sing-box/log" "github.com/sagernet/sing/common/rw" diff --git a/common/proxyproto/listener.go b/common/proxyproto/listener.go index f61d227e..ff987967 100644 --- a/common/proxyproto/listener.go +++ b/common/proxyproto/listener.go @@ -24,13 +24,13 @@ func (l *Listener) Accept() (net.Conn, error) { bufReader := std_bufio.NewReader(conn) header, err := proxyproto.Read(bufReader) if err != nil && !(l.AcceptNoHeader && err == proxyproto.ErrNoProxyProtocol) { - return nil, err + return nil, &Error{err} } if bufReader.Buffered() > 0 { cache := buf.NewSize(bufReader.Buffered()) _, err = cache.ReadFullFrom(bufReader, cache.FreeLen()) if err != nil { - return nil, err + return nil, &Error{err} } conn = bufio.NewCachedConn(conn, cache) } @@ -42,3 +42,21 @@ func (l *Listener) Accept() (net.Conn, error) { } return conn, nil } + +var _ net.Error = (*Error)(nil) + +type Error struct { + error +} + +func (e *Error) Unwrap() error { + return e.error +} + +func (e *Error) Timeout() bool { + return false +} + +func (e *Error) Temporary() bool { + return true +} diff --git a/inbound/default.go b/inbound/default.go index 9a827519..4d64465b 100644 --- a/inbound/default.go +++ b/inbound/default.go @@ -13,6 +13,8 @@ import ( E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" + + "go.uber.org/atomic" ) var _ adapter.Inbound = (*myInboundAdapter)(nil) @@ -42,6 +44,8 @@ type myInboundAdapter struct { udpAddr M.Socksaddr packetOutboundClosed chan struct{} packetOutbound chan *myInboundPacket + + inShutdown atomic.Bool } func (a *myInboundAdapter) Type() string { @@ -97,6 +101,7 @@ func (a *myInboundAdapter) Start() error { } func (a *myInboundAdapter) Close() error { + a.inShutdown.Store(true) var err error if a.clearSystemProxy != nil { err = a.clearSystemProxy() diff --git a/inbound/default_tcp.go b/inbound/default_tcp.go index c089336b..ce4f0768 100644 --- a/inbound/default_tcp.go +++ b/inbound/default_tcp.go @@ -39,10 +39,17 @@ func (a *myInboundAdapter) loopTCPIn() { for { conn, err := tcpListener.Accept() if err != nil { - if E.IsClosed(err) { + //goland:noinspection GoDeprecation + //nolint:staticcheck + if netError, isNetError := err.(net.Error); isNetError && netError.Temporary() { + a.logger.Error(err) + continue + } + if a.inShutdown.Load() && E.IsClosed(err) { return } - a.logger.Error("accept: ", err) + a.tcpListener.Close() + a.logger.Error("serve error: ", err) continue } go a.injectTCP(conn, adapter.InboundContext{})