From 8f1475d5d07c20a10a1c4e1cb8724940821478d7 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 2 Jul 2023 09:59:18 +0800 Subject: [PATCH] chore: update to go1.21rc2, drop support for go1.19 --- .github/workflows/build.yml | 2 +- adapter/provider/provider.go | 2 +- common/utils/string_unsafe.go | 40 +++++-------------------------- component/dialer/control.go | 17 +++++++++++++ component/dialer/control_go119.go | 22 ----------------- component/dialer/control_go120.go | 26 -------------------- component/dialer/dialer.go | 7 +++--- component/dialer/error.go | 8 ------- component/iface/iface.go | 4 +--- dns/util.go | 2 +- go.mod | 9 ++++--- go.sum | 14 +++++------ rules/common/port.go | 2 +- rules/common/uid.go | 2 +- transport/hysteria/core/client.go | 2 +- transport/tuic/server.go | 2 +- transport/tuic/v4/client.go | 2 +- transport/tuic/v5/client.go | 2 +- 18 files changed, 47 insertions(+), 118 deletions(-) delete mode 100644 component/dialer/control_go119.go delete mode 100644 component/dialer/control_go120.go diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 26dc455ba..1957e9bf3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -128,7 +128,7 @@ jobs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: "1.20" + go-version: "1.21.0-rc.2" check-latest: true - name: Test diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 10861217f..d547dcb7a 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -299,7 +299,7 @@ func proxiesParseAndFilter(filter string, excludeFilter string, excludeTypeArray if err := yaml.Unmarshal(buf, schema); err != nil { proxies, err1 := convert.ConvertsV2Ray(buf) if err1 != nil { - return nil, fmt.Errorf("%s, %w", err.Error(), err1) + return nil, fmt.Errorf("%w, %w", err, err1) } schema.Proxies = proxies } diff --git a/common/utils/string_unsafe.go b/common/utils/string_unsafe.go index 7733df396..e427d2996 100644 --- a/common/utils/string_unsafe.go +++ b/common/utils/string_unsafe.go @@ -2,48 +2,20 @@ package utils import "unsafe" -// sliceHeader is equivalent to reflect.SliceHeader, but represents the pointer -// to the underlying array as unsafe.Pointer rather than uintptr, allowing -// sliceHeaders to be directly converted to slice objects. -type sliceHeader struct { - Data unsafe.Pointer - Len int - Cap int -} - -// slice returns a slice whose underlying array starts at ptr an which length -// and capacity are len. -func slice[T any](ptr *T, length int) []T { - var s []T - hdr := (*sliceHeader)(unsafe.Pointer(&s)) - hdr.Data = unsafe.Pointer(ptr) - hdr.Len = length - hdr.Cap = length - return s -} - -// stringHeader is equivalent to reflect.StringHeader, but represents the -// pointer to the underlying array as unsafe.Pointer rather than uintptr, -// allowing StringHeaders to be directly converted to strings. -type stringHeader struct { - Data unsafe.Pointer - Len int -} - // ImmutableBytesFromString is equivalent to []byte(s), except that it uses the // same memory backing s instead of making a heap-allocated copy. This is only // valid if the returned slice is never mutated. func ImmutableBytesFromString(s string) []byte { - shdr := (*stringHeader)(unsafe.Pointer(&s)) - return slice((*byte)(shdr.Data), shdr.Len) + b := unsafe.StringData(s) + return unsafe.Slice(b, len(s)) } // StringFromImmutableBytes is equivalent to string(bs), except that it uses // the same memory backing bs instead of making a heap-allocated copy. This is // only valid if bs is never mutated after StringFromImmutableBytes returns. func StringFromImmutableBytes(bs []byte) string { - // This is cheaper than messing with StringHeader and SliceHeader, which as - // of this writing produces many dead stores of zeroes. Compare - // strings.Builder.String(). - return *(*string)(unsafe.Pointer(&bs)) + if len(bs) == 0 { + return "" + } + return unsafe.String(&bs[0], len(bs)) } diff --git a/component/dialer/control.go b/component/dialer/control.go index 26b1db76c..18ed84e42 100644 --- a/component/dialer/control.go +++ b/component/dialer/control.go @@ -20,3 +20,20 @@ func addControlToListenConfig(lc *net.ListenConfig, fn controlFn) { return fn(context.Background(), network, address, c) } } + +func addControlToDialer(d *net.Dialer, fn controlFn) { + ld := *d + d.ControlContext = func(ctx context.Context, network, address string, c syscall.RawConn) (err error) { + switch { + case ld.ControlContext != nil: + if err = ld.ControlContext(ctx, network, address, c); err != nil { + return + } + case ld.Control != nil: + if err = ld.Control(network, address, c); err != nil { + return + } + } + return fn(ctx, network, address, c) + } +} diff --git a/component/dialer/control_go119.go b/component/dialer/control_go119.go deleted file mode 100644 index ec980586c..000000000 --- a/component/dialer/control_go119.go +++ /dev/null @@ -1,22 +0,0 @@ -//go:build !go1.20 - -package dialer - -import ( - "context" - "net" - "syscall" -) - -func addControlToDialer(d *net.Dialer, fn controlFn) { - ld := *d - d.Control = func(network, address string, c syscall.RawConn) (err error) { - switch { - case ld.Control != nil: - if err = ld.Control(network, address, c); err != nil { - return - } - } - return fn(context.Background(), network, address, c) - } -} diff --git a/component/dialer/control_go120.go b/component/dialer/control_go120.go deleted file mode 100644 index 65e33f9c2..000000000 --- a/component/dialer/control_go120.go +++ /dev/null @@ -1,26 +0,0 @@ -//go:build go1.20 - -package dialer - -import ( - "context" - "net" - "syscall" -) - -func addControlToDialer(d *net.Dialer, fn controlFn) { - ld := *d - d.ControlContext = func(ctx context.Context, network, address string, c syscall.RawConn) (err error) { - switch { - case ld.ControlContext != nil: - if err = ld.ControlContext(ctx, network, address, c); err != nil { - return - } - case ld.Control != nil: - if err = ld.Control(network, address, c); err != nil { - return - } - } - return fn(ctx, network, address, c) - } -} diff --git a/component/dialer/dialer.go b/component/dialer/dialer.go index 5a55cd220..5e19046c1 100644 --- a/component/dialer/dialer.go +++ b/component/dialer/dialer.go @@ -2,6 +2,7 @@ package dialer import ( "context" + "errors" "fmt" "net" "net/netip" @@ -207,7 +208,7 @@ func dualStackDialContext(ctx context.Context, dialFn dialFunc, network string, if fallback.error == nil && fallback.Conn != nil { return fallback.Conn, nil } - return nil, errorsJoin(errs...) + return nil, errors.Join(errs...) } func parallelDialContext(ctx context.Context, network string, ips []netip.Addr, port string, opt *option) (net.Conn, error) { @@ -244,7 +245,7 @@ func parallelDialContext(ctx context.Context, network string, ips []netip.Addr, } if len(errs) > 0 { - return nil, errorsJoin(errs...) + return nil, errors.Join(errs...) } return nil, os.ErrDeadlineExceeded } @@ -261,7 +262,7 @@ func serialDialContext(ctx context.Context, network string, ips []netip.Addr, po errs = append(errs, err) } } - return nil, errorsJoin(errs...) + return nil, errors.Join(errs...) } type dialResult struct { diff --git a/component/dialer/error.go b/component/dialer/error.go index f2f6b4b74..035baa032 100644 --- a/component/dialer/error.go +++ b/component/dialer/error.go @@ -2,17 +2,9 @@ package dialer import ( "errors" - - E "github.com/sagernet/sing/common/exceptions" ) var ( ErrorNoIpAddress = errors.New("no ip address") ErrorInvalidedNetworkStack = errors.New("invalided network stack") ) - -func errorsJoin(errs ...error) error { - // compatibility with golang<1.20 - // maybe use errors.Join(errs...) is better after we drop the old version's support - return E.Errors(errs...) -} diff --git a/component/iface/iface.go b/component/iface/iface.go index dca6cca1d..c32b65abe 100644 --- a/component/iface/iface.go +++ b/component/iface/iface.go @@ -24,8 +24,6 @@ var ( var interfaces = singledo.NewSingle[map[string]*Interface](time.Second * 20) -const FlagRunning = 32 // interface is in running state, compatibility with golang<1.20 - func ResolveInterface(name string) (*Interface, error) { value, err, _ := interfaces.Do(func() (map[string]*Interface, error) { ifaces, err := net.Interfaces() @@ -41,7 +39,7 @@ func ResolveInterface(name string) (*Interface, error) { continue } // if not available device like Meta, dummy0, docker0, etc. - if (iface.Flags&net.FlagMulticast == 0) || (iface.Flags&net.FlagPointToPoint != 0) || (iface.Flags&FlagRunning == 0) { + if (iface.Flags&net.FlagMulticast == 0) || (iface.Flags&net.FlagPointToPoint != 0) || (iface.Flags&net.FlagRunning == 0) { continue } diff --git a/dns/util.go b/dns/util.go index edd26a425..73d117b85 100644 --- a/dns/util.go +++ b/dns/util.go @@ -313,7 +313,7 @@ func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.M if elm == nil { err := errors.New("all DNS requests failed") if fErr := fast.Error(); fErr != nil { - err = fmt.Errorf("%w, first error: %s", err, fErr.Error()) + err = fmt.Errorf("%w, first error: %w", err, fErr) } return nil, true, err } diff --git a/go.mod b/go.mod index 7f22b51f2..b9a855ab9 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/Dreamacro/clash -go 1.19 +go 1.20 require ( github.com/3andne/restls-client-go v0.1.4 @@ -20,7 +20,7 @@ require ( github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 github.com/mdlayher/netlink v1.7.2 github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 - github.com/metacubex/quic-go v0.36.2-0.20230702005921-2ded1deb0eed + github.com/metacubex/quic-go v0.36.2-0.20230702012232-c341ad4d2d5d github.com/metacubex/sing-shadowsocks v0.2.2 github.com/metacubex/sing-shadowsocks2 v0.1.0 github.com/metacubex/sing-tun v0.1.5-0.20230618235243-65051e73b018 @@ -85,8 +85,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect + github.com/quic-go/qtls-go1-20 v0.3.0 // indirect github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61 // indirect github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 // indirect github.com/scjalliance/comshim v0.0.0-20230315213746-5e51f40bd3b9 // indirect @@ -106,4 +105,4 @@ require ( golang.org/x/tools v0.9.1 // indirect ) -replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20230618234508-ce8816d0274b +replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20230702015813-e4a7ce9ea42c diff --git a/go.sum b/go.sum index cc37ff703..35f46b74c 100644 --- a/go.sum +++ b/go.sum @@ -94,10 +94,10 @@ github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvO github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88= github.com/metacubex/gvisor v0.0.0-20230611153922-78842f086475 h1:qSEOvPPaMrWggFyFhFYGyMR8i1HKyhXjdi1QYUAa2ww= github.com/metacubex/gvisor v0.0.0-20230611153922-78842f086475/go.mod h1:wehEpqiogdeyncfhckJP5gD2LtBgJW0wnDC24mJ+8Jg= -github.com/metacubex/quic-go v0.36.2-0.20230702005921-2ded1deb0eed h1:qciZMbuG8vlL6PIwBIayAiaiRPdcnr0SQOmd3/a0mto= -github.com/metacubex/quic-go v0.36.2-0.20230702005921-2ded1deb0eed/go.mod h1:mnMWBbeYt+xTvFQrAWu9IJH0h++EjnAS2B/aj+VEXzQ= -github.com/metacubex/sing v0.0.0-20230618234508-ce8816d0274b h1:mVd3v+zMQq61rJe/pJJSh0/Iin9UnkQaZTH2NOg/2Vg= -github.com/metacubex/sing v0.0.0-20230618234508-ce8816d0274b/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= +github.com/metacubex/quic-go v0.36.2-0.20230702012232-c341ad4d2d5d h1:LCMD4JnahhgImBdfsGe0PAQiYNx2UlqvrGpYbZ0CVHs= +github.com/metacubex/quic-go v0.36.2-0.20230702012232-c341ad4d2d5d/go.mod h1:runF6UZHW4A/P/VU+PtfQKKD85YgaZgrgbvCTs5Nwbk= +github.com/metacubex/sing v0.0.0-20230702015813-e4a7ce9ea42c h1:mdtRHbznkJGnjgJ/yLCRtX3oD9nfqTrJ/VkisTRbqNg= +github.com/metacubex/sing v0.0.0-20230702015813-e4a7ce9ea42c/go.mod h1:Ta8nHnDLAwqySzKhGoKk4ZIB+vJ3GTKj7UPrWYvM+4w= github.com/metacubex/sing-shadowsocks v0.2.2 h1:prciO78IwtR4Sp+/CnP+aZSzpBRfL7zKaYez1S4EOnI= github.com/metacubex/sing-shadowsocks v0.2.2/go.mod h1:haolI+8Yc8MhNDqNuoRP4X5vaquXWNYeL1YxrQZ5kCU= github.com/metacubex/sing-shadowsocks2 v0.1.0 h1:ZxPEToY1RaRtG6ljz2n13ASMVqyAM7Bh11TmWoExYu4= @@ -136,10 +136,8 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/qtls-go1-20 v0.3.0 h1:NrCXmDl8BddZwO67vlvEpBTwT89bJfKYygxv4HQvuDk= +github.com/quic-go/qtls-go1-20 v0.3.0/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61 h1:5+m7c6AkmAylhauulqN/c5dnh8/KssrE9c93TQrXldA= github.com/sagernet/go-tun2socks v1.16.12-0.20220818015926-16cb67876a61/go.mod h1:QUQ4RRHD6hGGHdFMEtR8T2P6GS6R3D/CXKdaYHKKXms= diff --git a/rules/common/port.go b/rules/common/port.go index e3949f515..aeacc4dc6 100644 --- a/rules/common/port.go +++ b/rules/common/port.go @@ -48,7 +48,7 @@ func (p *Port) matchPortReal(portRef string) bool { func NewPort(port string, adapter string, ruleType C.RuleType) (*Port, error) { portRanges, err := utils.NewIntRanges[uint16](port) if err != nil { - return nil, fmt.Errorf("%w, %s", errPayload, err.Error()) + return nil, fmt.Errorf("%w, %w", errPayload, err) } if len(portRanges) == 0 { diff --git a/rules/common/uid.go b/rules/common/uid.go index b191a55fb..3b20928ff 100644 --- a/rules/common/uid.go +++ b/rules/common/uid.go @@ -23,7 +23,7 @@ func NewUid(oUid, adapter string) (*Uid, error) { uidRange, err := utils.NewIntRanges[uint32](oUid) if err != nil { - return nil, fmt.Errorf("%w, %s", errPayload, err.Error()) + return nil, fmt.Errorf("%w, %w", errPayload, err) } if len(uidRange) == 0 { diff --git a/transport/hysteria/core/client.go b/transport/hysteria/core/client.go index e0f3a0dd1..a219e76cc 100644 --- a/transport/hysteria/core/client.go +++ b/transport/hysteria/core/client.go @@ -135,7 +135,7 @@ func (c *Client) handleControlStream(qs quic.Connection, stream quic.Stream) (bo func (c *Client) handleMessage(qs quic.Connection) { for { - msg, err := qs.ReceiveMessage() + msg, err := qs.ReceiveMessage(context.Background()) if err != nil { break } diff --git a/transport/tuic/server.go b/transport/tuic/server.go index 47850107f..a6f91b88b 100644 --- a/transport/tuic/server.go +++ b/transport/tuic/server.go @@ -114,7 +114,7 @@ func (s *serverHandler) handle() { func (s *serverHandler) handleMessage() (err error) { for { var message []byte - message, err = s.quicConn.ReceiveMessage() + message, err = s.quicConn.ReceiveMessage(context.Background()) if err != nil { return err } diff --git a/transport/tuic/v4/client.go b/transport/tuic/v4/client.go index e1a334e57..fd3bf54ac 100644 --- a/transport/tuic/v4/client.go +++ b/transport/tuic/v4/client.go @@ -196,7 +196,7 @@ func (t *clientImpl) handleMessage(quicConn quic.Connection) (err error) { }() for { var message []byte - message, err = quicConn.ReceiveMessage() + message, err = quicConn.ReceiveMessage(context.Background()) if err != nil { return err } diff --git a/transport/tuic/v5/client.go b/transport/tuic/v5/client.go index cb1d538cb..74dfd5813 100644 --- a/transport/tuic/v5/client.go +++ b/transport/tuic/v5/client.go @@ -195,7 +195,7 @@ func (t *clientImpl) handleMessage(quicConn quic.Connection) (err error) { }() for { var message []byte - message, err = quicConn.ReceiveMessage() + message, err = quicConn.ReceiveMessage(context.Background()) if err != nil { return err }