From fa63beceb6863c7fedc88525910ebc90a2a6442d Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Wed, 28 Mar 2018 22:23:24 +0200 Subject: [PATCH] fix double release on buffers --- app/proxyman/mux/mux.go | 5 ----- proxy/shadowsocks/server.go | 15 ++++++++------- proxy/vmess/inbound/inbound.go | 17 +++++++++-------- proxy/vmess/outbound/outbound.go | 17 +++++++++-------- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/app/proxyman/mux/mux.go b/app/proxyman/mux/mux.go index 2119dceb..c46312bc 100644 --- a/app/proxyman/mux/mux.go +++ b/app/proxyman/mux/mux.go @@ -150,11 +150,6 @@ func fetchInput(ctx context.Context, s *Session, output buf.Writer) { defer s.Close() newError("dispatching request to ", dest).WithContext(ctx).WriteToLog() - data, _ := s.input.ReadTimeout(time.Millisecond * 500) - if err := writer.WriteMultiBuffer(data); err != nil { - newError("failed to write first payload").Base(err).WithContext(ctx).WriteToLog() - return - } if err := buf.Copy(s.input, writer); err != nil { newError("failed to fetch all input").Base(err).WithContext(ctx).WriteToLog() } diff --git a/proxy/shadowsocks/server.go b/proxy/shadowsocks/server.go index ffb67692..5b75b9e0 100644 --- a/proxy/shadowsocks/server.go +++ b/proxy/shadowsocks/server.go @@ -178,14 +178,15 @@ func (s *Server) handleConnection(ctx context.Context, conn internet.Connection, return newError("failed to write response").Base(err) } - payload, err := ray.InboundOutput().ReadMultiBuffer() - if err != nil { - return err + { + payload, err := ray.InboundOutput().ReadMultiBuffer() + if err != nil { + return err + } + if err := responseWriter.WriteMultiBuffer(payload); err != nil { + return err + } } - if err := responseWriter.WriteMultiBuffer(payload); err != nil { - return err - } - payload.Release() if err := bufferedWriter.SetBuffered(false); err != nil { return err diff --git a/proxy/vmess/inbound/inbound.go b/proxy/vmess/inbound/inbound.go index df85770e..df998853 100644 --- a/proxy/vmess/inbound/inbound.go +++ b/proxy/vmess/inbound/inbound.go @@ -182,16 +182,17 @@ func transferResponse(timer signal.ActivityUpdater, session *encoding.ServerSess bodyWriter := session.EncodeResponseBody(request, output) - // Optimize for small response packet - data, err := input.ReadMultiBuffer() - if err != nil { - return err - } + { + // Optimize for small response packet + data, err := input.ReadMultiBuffer() + if err != nil { + return err + } - if err := bodyWriter.WriteMultiBuffer(data); err != nil { - return err + if err := bodyWriter.WriteMultiBuffer(data); err != nil { + return err + } } - data.Release() if bufferedWriter, ok := output.(*buf.BufferedWriter); ok { if err := bufferedWriter.SetBuffered(false); err != nil { diff --git a/proxy/vmess/outbound/outbound.go b/proxy/vmess/outbound/outbound.go index a6b937c1..a59904d3 100644 --- a/proxy/vmess/outbound/outbound.go +++ b/proxy/vmess/outbound/outbound.go @@ -113,15 +113,16 @@ func (v *Handler) Process(ctx context.Context, outboundRay ray.OutboundRay, dial } bodyWriter := session.EncodeRequestBody(request, writer) - firstPayload, err := input.ReadTimeout(time.Millisecond * 500) - if err != nil && err != buf.ErrReadTimeout { - return newError("failed to get first payload").Base(err) - } - if !firstPayload.IsEmpty() { - if err := bodyWriter.WriteMultiBuffer(firstPayload); err != nil { - return newError("failed to write first payload").Base(err) + { + firstPayload, err := input.ReadTimeout(time.Millisecond * 500) + if err != nil && err != buf.ErrReadTimeout { + return newError("failed to get first payload").Base(err) + } + if !firstPayload.IsEmpty() { + if err := bodyWriter.WriteMultiBuffer(firstPayload); err != nil { + return newError("failed to write first payload").Base(err) + } } - firstPayload.Release() } if err := writer.SetBuffered(false); err != nil {