From 293d84ed930506ac5b26c2898584c3349e724567 Mon Sep 17 00:00:00 2001 From: patterniha <71074308+patterniha@users.noreply.github.com> Date: Wed, 9 Jul 2025 01:34:18 +0330 Subject: [PATCH] Update server.go --- common/mux/server.go | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/common/mux/server.go b/common/mux/server.go index 8fc0ae09..30dcf06e 100644 --- a/common/mux/server.go +++ b/common/mux/server.go @@ -201,11 +201,12 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, transferType: protocol.TransferTypePacket, XUDP: x, } - go handle(ctx, x.Mux, w.link.Writer) x.Status = Active if !w.sessionManager.Add(x.Mux) { x.Mux.Close(false) + return errors.New("failed to add new session") } + go handle(ctx, x.Mux, w.link.Writer) return nil } @@ -226,18 +227,23 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, if meta.Target.Network == net.Network_UDP { s.transferType = protocol.TransferTypePacket } - w.sessionManager.Add(s) + if !w.sessionManager.Add(s) { + s.Close(false) + return errors.New("failed to add new session") + } go handle(ctx, s, w.link.Writer) if !meta.Option.Has(OptionData) { return nil } rr := s.NewReader(reader, &meta.Target) - if err := buf.Copy(rr, s.output); err != nil { - buf.Copy(rr, buf.Discard) - return s.Close(false) + err = buf.Copy(rr, s.output) + + if err != nil && buf.IsWriteError(err) { + s.Close(false) + return buf.Copy(rr, buf.Discard) } - return nil + return err } func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error { @@ -304,10 +310,11 @@ func (w *ServerWorker) handleFrame(ctx context.Context, reader *buf.BufferedRead } func (w *ServerWorker) run(ctx context.Context) { - input := w.link.Reader - reader := &buf.BufferedReader{Reader: input} + reader := &buf.BufferedReader{Reader: w.link.Reader} defer w.sessionManager.Close() + defer common.Close(w.link.Writer) + defer common.Interrupt(w.link.Reader) for { select { @@ -318,7 +325,6 @@ func (w *ServerWorker) run(ctx context.Context) { if err != nil { if errors.Cause(err) != io.EOF { errors.LogInfoInner(ctx, err, "unexpected EOF") - common.Interrupt(input) } return }