From 3a15f799c2f27756f39ab77b194d52dfbe8673f5 Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Sat, 5 Nov 2016 01:00:09 +0100 Subject: [PATCH] prevent deadlock in shadowsocks --- proxy/shadowsocks/client.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/proxy/shadowsocks/client.go b/proxy/shadowsocks/client.go index 02509d58..d02b024e 100644 --- a/proxy/shadowsocks/client.go +++ b/proxy/shadowsocks/client.go @@ -101,9 +101,6 @@ func (this *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffe return errors.New("Shadowsocks|Client: Failed to write payload: " + err.Error()) } - bufferedWriter.SetCached(false) - v2io.Pipe(ray.OutboundInput(), bodyWriter) - var responseMutex sync.Mutex responseMutex.Lock() @@ -119,19 +116,13 @@ func (this *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffe v2io.Pipe(responseReader, ray.OutboundOutput()) }() + bufferedWriter.SetCached(false) + v2io.Pipe(ray.OutboundInput(), bodyWriter) + responseMutex.Lock() } if request.Command == protocol.RequestCommandUDP { - writer := &UDPWriter{ - Writer: conn, - Request: request, - } - if err := writer.Write(payload); err != nil { - return errors.New("Shadowsocks|Client: Failed to write payload: " + err.Error()) - } - v2io.Pipe(ray.OutboundInput(), writer) - timedReader := v2net.NewTimeOutReader(16, conn) var responseMutex sync.Mutex responseMutex.Lock() @@ -147,6 +138,15 @@ func (this *Client) Dispatch(destination v2net.Destination, payload *alloc.Buffe v2io.Pipe(reader, ray.OutboundOutput()) }() + writer := &UDPWriter{ + Writer: conn, + Request: request, + } + if err := writer.Write(payload); err != nil { + return errors.New("Shadowsocks|Client: Failed to write payload: " + err.Error()) + } + v2io.Pipe(ray.OutboundInput(), writer) + responseMutex.Lock() }