diff --git a/common/mux/client.go b/common/mux/client.go index 1d0180eef..ab729ef71 100644 --- a/common/mux/client.go +++ b/common/mux/client.go @@ -188,6 +188,7 @@ var ( // NewClientWorker creates a new mux.Client. func NewClientWorker(stream transport.Link, s ClientStrategy) (*ClientWorker, error) { + stream.Writer = &MutexWriter{Writer: stream.Writer} c := &ClientWorker{ sessionManager: NewSessionManager(), link: stream, diff --git a/common/mux/server.go b/common/mux/server.go index c23a3789e..8dd48a131 100644 --- a/common/mux/server.go +++ b/common/mux/server.go @@ -95,7 +95,7 @@ type ServerWorker struct { func NewServerWorker(ctx context.Context, d routing.Dispatcher, link *transport.Link) (*ServerWorker, error) { worker := &ServerWorker{ dispatcher: d, - link: link, + link: &transport.Link{Reader: link.Reader, Writer: &MutexWriter{Writer: link.Writer}}, sessionManager: NewSessionManager(), done: done.New(), timer: time.NewTicker(60 * time.Second), diff --git a/common/mux/writer.go b/common/mux/writer.go index 0429f4fab..ac5ec6c4f 100644 --- a/common/mux/writer.go +++ b/common/mux/writer.go @@ -1,6 +1,8 @@ package mux import ( + "sync" + "github.com/xtls/xray-core/common" "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/net" @@ -9,6 +11,17 @@ import ( "github.com/xtls/xray-core/common/session" ) +type MutexWriter struct { + sync.Mutex + buf.Writer +} + +func (w *MutexWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { + w.Lock() + defer w.Unlock() + return w.Writer.WriteMultiBuffer(mb) +} + type Writer struct { dest net.Destination writer buf.Writer