Explorar o código

prevent deadlock in shadowsocks

Darien Raymond %!s(int64=9) %!d(string=hai) anos
pai
achega
3a15f799c2
Modificáronse 1 ficheiros con 12 adicións e 12 borrados
  1. 12 12
      proxy/shadowsocks/client.go

+ 12 - 12
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()
 	}