From 2f24328df48a43fa529a155822e68168cc97a58a Mon Sep 17 00:00:00 2001 From: Fangliding Date: Tue, 13 Oct 2026 22:48:38 +0800 Subject: [PATCH] SS2022: Correct interrupt behavior and UDP conn change Co-authored-by: ChownYourLife <260039878+ChownYourLife@users.noreply.github.com> --- proxy/shadowsocks_2022/outbound.go | 8 ++++---- proxy/shadowsocks_2022/shadowsocks_2022.go | 4 +--- proxy/shadowsocks_2022/stream.go | 8 ++++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/proxy/shadowsocks_2022/outbound.go b/proxy/shadowsocks_2022/outbound.go index 67e0acd28..c7ee1e279 100644 --- a/proxy/shadowsocks_2022/outbound.go +++ b/proxy/shadowsocks_2022/outbound.go @@ -169,8 +169,8 @@ func (o *Outbound) Process(ctx context.Context, link *transport.Link, dialer int return buf.Copy(responseReader, link.Writer, buf.UpdateActivity(timer)) } - responseDoneAndCloseWriter := task.OnSuccess(responseDone, task.Close(link.Writer)) - if err := task.Run(ctx, requestDone, responseDoneAndCloseWriter); err != nil { + responseDonePost := task.OnSuccess(responseDone, task.Close(link.Writer)) + if err := task.Run(ctx, requestDone, responseDonePost); err != nil { return errors.New("connection ends").Base(err) } @@ -212,8 +212,8 @@ func (o *Outbound) Process(ctx context.Context, link *transport.Link, dialer int return nil } - responseDoneAndCloseWriter := task.OnSuccess(responseDone, task.Close(link.Writer)) - if err := task.Run(ctx, requestDone, responseDoneAndCloseWriter); err != nil { + responseDonePost := task.OnSuccess(responseDone, task.Close(link.Writer)) + if err := task.Run(ctx, requestDone, responseDonePost); err != nil { return errors.New("connection ends").Base(err) } diff --git a/proxy/shadowsocks_2022/shadowsocks_2022.go b/proxy/shadowsocks_2022/shadowsocks_2022.go index ec8562e6a..bb2297d0e 100644 --- a/proxy/shadowsocks_2022/shadowsocks_2022.go +++ b/proxy/shadowsocks_2022/shadowsocks_2022.go @@ -18,9 +18,7 @@ import ( ) func (s *ServerUDPSession) UpdateConn(conn stat.Connection) { - if s.currentConn.Load() == nil { - s.currentConn.Store(conn) - } + s.currentConn.Store(conn) if s.timer != nil { s.timer.Update() } diff --git a/proxy/shadowsocks_2022/stream.go b/proxy/shadowsocks_2022/stream.go index acde16155..22181ceff 100644 --- a/proxy/shadowsocks_2022/stream.go +++ b/proxy/shadowsocks_2022/stream.go @@ -11,6 +11,7 @@ import ( "sync" "time" + "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/antireplay" "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/errors" @@ -629,6 +630,9 @@ func InitServerStream(conn net.Conn, method *CipherMethod, psk, saltSlice []byte func TransportTCP(ctx context.Context, sessionPolicy policy.Session, reader buf.Reader, writer buf.Writer, link *transport.Link) error { ctx, cancel := context.WithCancel(ctx) timer := signal.CancelAfterInactivity(ctx, cancel, sessionPolicy.Timeouts.ConnectionIdle) + defer timer.SetTimeout(0) + defer common.Interrupt(link.Reader) + defer common.Interrupt(link.Writer) ctx = policy.ContextWithBufferPolicy(ctx, sessionPolicy.Buffer) requestDone := func() error { @@ -644,6 +648,6 @@ func TransportTCP(ctx context.Context, sessionPolicy policy.Session, reader buf. return buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)) } - responseDoneAndCloseWriter := task.OnSuccess(responseDone, task.Close(link.Writer)) - return task.Run(ctx, requestDone, responseDoneAndCloseWriter) + requestDonePost := task.OnSuccess(requestDone, task.Close(link.Writer)) + return task.Run(ctx, requestDonePost, responseDone) }