浏览代码

properly close shadowsocks client udp connection

Darien Raymond 7 年之前
父节点
当前提交
03ba5ef4cb
共有 1 个文件被更改,包括 4 次插入1 次删除
  1. 4 1
      proxy/shadowsocks/client.go

+ 4 - 1
proxy/shadowsocks/client.go

@@ -141,6 +141,8 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale
 		})
 		})
 
 
 		requestDone := signal.ExecuteAsync(func() error {
 		requestDone := signal.ExecuteAsync(func() error {
+			defer timer.SetTimeout(sessionPolicy.Timeouts.DownlinkOnly)
+
 			if err := buf.Copy(outboundRay.OutboundInput(), writer, buf.UpdateActivity(timer)); err != nil {
 			if err := buf.Copy(outboundRay.OutboundInput(), writer, buf.UpdateActivity(timer)); err != nil {
 				return newError("failed to transport all UDP request").Base(err)
 				return newError("failed to transport all UDP request").Base(err)
 			}
 			}
@@ -149,13 +151,14 @@ func (v *Client) Process(ctx context.Context, outboundRay ray.OutboundRay, diale
 
 
 		responseDone := signal.ExecuteAsync(func() error {
 		responseDone := signal.ExecuteAsync(func() error {
 			defer outboundRay.OutboundOutput().Close()
 			defer outboundRay.OutboundOutput().Close()
+			defer timer.SetTimeout(sessionPolicy.Timeouts.UplinkOnly)
 
 
 			reader := &UDPReader{
 			reader := &UDPReader{
 				Reader: conn,
 				Reader: conn,
 				User:   user,
 				User:   user,
 			}
 			}
 
 
-			if err := buf.Copy(reader, outboundRay.OutboundOutput(), buf.UpdateActivity(timer), buf.IgnoreReaderError()); err != nil {
+			if err := buf.Copy(reader, outboundRay.OutboundOutput(), buf.UpdateActivity(timer)); err != nil {
 				return newError("failed to transport all UDP response").Base(err)
 				return newError("failed to transport all UDP response").Base(err)
 			}
 			}
 			return nil
 			return nil