diff --git a/connector/ss/metadata.go b/connector/ss/metadata.go index 36b098c1..ee9b7c8b 100644 --- a/connector/ss/metadata.go +++ b/connector/ss/metadata.go @@ -10,19 +10,16 @@ import ( type metadata struct { key string connectTimeout time.Duration - noDelay bool } func (c *ssConnector) parseMetadata(md mdata.Metadata) (err error) { const ( key = "key" connectTimeout = "timeout" - noDelay = "nodelay" ) c.md.key = mdutil.GetString(md, key) c.md.connectTimeout = mdutil.GetDuration(md, connectTimeout) - c.md.noDelay = mdutil.GetBool(md, noDelay) return } diff --git a/connector/ss/udp/connector.go b/connector/ss/udp/connector.go index 98b761e8..9a30a488 100644 --- a/connector/ss/udp/connector.go +++ b/connector/ss/udp/connector.go @@ -58,13 +58,8 @@ func (c *ssuConnector) Init(md md.Metadata) (err error) { } clientConfig.UDPTimeout = time.Minute - tcpClientConfig, err := utils.NewClientConfig(method, password) - if err != nil { - return err - } - c.clientCfg = clientConfig - c.tcpClient = core.NewTCPClient(tcpClientConfig) + c.tcpClient = core.NewTCPClient(clientConfig) return } @@ -98,15 +93,11 @@ func (c *ssuConnector) Connect(ctx context.Context, conn net.Conn, network, addr } serverAddr, err := netip.ParseAddrPort(conn.RemoteAddr().String()) if err != nil { - return nil, err + return nil, fmt.Errorf("ss: parse remote addr %q: %w", conn.RemoteAddr().String(), err) } clientCfg := c.clientCfg clientCfg.ServerAddr = serverAddr - client := core.NewUDPClient(core.ClientConfig{ - Cipher: clientCfg.Cipher, - ServerAddr: serverAddr, - UDPTimeout: time.Minute, - }) + client := core.NewUDPClient(clientCfg) if err := client.Init(); err != nil { return nil, err } diff --git a/go.mod b/go.mod index 0fa253e9..c9e913eb 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/gin-contrib/cors v1.7.2 github.com/gin-gonic/gin v1.10.1 github.com/go-gost/core v0.4.0 - github.com/go-gost/go-shadowsocks2 v0.1.2 + github.com/go-gost/go-shadowsocks2 v0.1.3 github.com/go-gost/gosocks4 v0.1.0 github.com/go-gost/gosocks5 v0.5.0 github.com/go-gost/plugin v0.3.0 diff --git a/go.sum b/go.sum index 21133a6a..2546a52c 100644 --- a/go.sum +++ b/go.sum @@ -51,8 +51,8 @@ github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/go-gost/core v0.4.0 h1:jLuIMO7ZMJX/BDCYLrYXAmIykT+HkqEuzaTeLMdrY1c= github.com/go-gost/core v0.4.0/go.mod h1:WGI43jOka7FAsSAwi/fSMaqxdR+E339ycb4NBGlFr6A= -github.com/go-gost/go-shadowsocks2 v0.1.2 h1:qgTUQS6aCGzsFArjiKjLP0a7zEVtEYVCRVc5LjOsaVk= -github.com/go-gost/go-shadowsocks2 v0.1.2/go.mod h1:866zFNNI3He6Wef1M/IvAjTal74WhcfKfBgRpTlkKys= +github.com/go-gost/go-shadowsocks2 v0.1.3 h1:6CUZLp+mTWXnKP2aK8/Z9ZP+ERMX9gSbywmPu4kGX/A= +github.com/go-gost/go-shadowsocks2 v0.1.3/go.mod h1:866zFNNI3He6Wef1M/IvAjTal74WhcfKfBgRpTlkKys= github.com/go-gost/gosocks4 v0.1.0 h1:eAzev6qw4fzkFQKC9uCHLVNnnPdHyqCggbnfNN80Pmk= github.com/go-gost/gosocks4 v0.1.0/go.mod h1:hzVjwijJuZR1pp3GqpTj+AKcSGrx68RlWTrQMFMYBP0= github.com/go-gost/gosocks5 v0.5.0 h1:YE37l1MJwde8diIQdynStqogMotG5enoTdborhA5yic= diff --git a/handler/ss/handler.go b/handler/ss/handler.go index 8837a6c4..973530c6 100644 --- a/handler/ss/handler.go +++ b/handler/ss/handler.go @@ -149,7 +149,7 @@ func (h *ssHandler) Handle(ctx context.Context, conn net.Conn, opts ...handler.H target = tc.Target() } if len(target) == 0 { - return + return errors.New("ss: target not available") } conn = wrappedConn diff --git a/handler/ss/udp/handler.go b/handler/ss/udp/handler.go index ddb12c32..e15dfd23 100644 --- a/handler/ss/udp/handler.go +++ b/handler/ss/udp/handler.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "errors" + "fmt" "net" "sync" "time" @@ -191,7 +192,7 @@ func (h *ssuHandler) relayPacketUDP(ctx context.Context, src net.PacketConn, ro TargetAddr() net.Addr }) if !ok { - return errors.New("ss: missing udp session context") + return fmt.Errorf("ss: missing udp session context for addr %v", addr) } targetAddr := ctxAddr.TargetAddr() @@ -204,9 +205,13 @@ func (h *ssuHandler) relayPacketUDP(ctx context.Context, src net.PacketConn, ro return nil } + if targetAddr == nil { + return errors.New("ss: target address not available") + } + session := ctxAddr.Session() if session == nil { - return errors.New("ss: udp session not found") + return fmt.Errorf("ss: udp session not found for addr %v", addr) } dstConn, err := h.packetConnForSession(ctx, src, session, ro, log) @@ -255,10 +260,11 @@ func (h *ssuHandler) packetConnForSession(ctx context.Context, src net.PacketCon h.connMap.Delete(session.Hash()) }() - b := make([]byte, h.md.udpBufferSize) - if len(b) == 0 { - b = make([]byte, defaultBufferSize) + bufSize := h.md.udpBufferSize + if bufSize <= 0 { + bufSize = defaultBufferSize } + b := make([]byte, bufSize) for { n, raddr, err := cc.ReadFrom(b) diff --git a/internal/util/ss/ss.go b/internal/util/ss/ss.go index 2327c277..40b825d1 100644 --- a/internal/util/ss/ss.go +++ b/internal/util/ss/ss.go @@ -36,10 +36,7 @@ func (c *shadowConn) Write(b []byte) (n int, err error) { c.wbuf.Write(b) // append the data to the cached header written, err := c.Conn.Write(c.wbuf.Bytes()) if err != nil { - // If short write, keep unwritten bytes - if written > 0 && written < c.wbuf.Len() { - c.wbuf.Next(written) - } + c.wbuf.Reset() return written, err } c.wbuf.Reset()