From b453288e0415b102cb7041fd64e5bc2f938aa05d Mon Sep 17 00:00:00 2001 From: v2ray Date: Sun, 1 May 2016 17:18:02 +0200 Subject: [PATCH] release shadowsocks request --- proxy/shadowsocks/protocol.go | 13 +++++++++++++ proxy/shadowsocks/shadowsocks.go | 16 ++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go index ceec76f00..f63e7a68c 100644 --- a/proxy/shadowsocks/protocol.go +++ b/proxy/shadowsocks/protocol.go @@ -24,6 +24,19 @@ type Request struct { UDPPayload *alloc.Buffer } +func (this *Request) Release() { + this.Address = nil + if this.UDPPayload != nil { + this.UDPPayload.Release() + } +} + +func (this *Request) DetachUDPPayload() *alloc.Buffer { + payload := this.UDPPayload + this.UDPPayload = nil + return payload +} + func ReadRequest(reader io.Reader, auth *Authenticator, udp bool) (*Request, error) { buffer := alloc.NewSmallBuffer() defer buffer.Release() diff --git a/proxy/shadowsocks/shadowsocks.go b/proxy/shadowsocks/shadowsocks.go index 9fc48f036..eec1c6747 100644 --- a/proxy/shadowsocks/shadowsocks.go +++ b/proxy/shadowsocks/shadowsocks.go @@ -110,12 +110,13 @@ func (this *Shadowsocks) handlerUDPPayload(payload *alloc.Buffer, source v2net.D log.Warning("Shadowsocks: Invalid request from ", source, ": ", err) return } + defer request.Release() dest := v2net.UDPDestination(request.Address, request.Port) log.Access(source, dest, log.AccessAccepted, serial.StringLiteral("")) log.Info("Shadowsocks: Tunnelling request to ", dest) - this.udpServer.Dispatch(source, dest, request.UDPPayload, func(destination v2net.Destination, payload *alloc.Buffer) { + this.udpServer.Dispatch(source, dest, request.DetachUDPPayload(), func(destination v2net.Destination, payload *alloc.Buffer) { defer payload.Release() response := alloc.NewBuffer().Slice(0, ivLen) @@ -163,9 +164,13 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) { defer buffer.Release() timedReader := v2net.NewTimeOutReader(16, conn) + defer timedReader.Release() + + bufferedReader := v2io.NewBufferedReader(timedReader) + defer bufferedReader.Release() ivLen := this.config.Cipher.IVSize() - _, err := io.ReadFull(timedReader, buffer.Value[:ivLen]) + _, err := io.ReadFull(bufferedReader, buffer.Value[:ivLen]) if err != nil { log.Access(conn.RemoteAddr(), serial.StringLiteral(""), log.AccessRejected, serial.StringLiteral(err.Error())) log.Error("Shadowsocks: Failed to read IV: ", err) @@ -181,7 +186,7 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) { return } - reader := crypto.NewCryptionReader(stream, timedReader) + reader := crypto.NewCryptionReader(stream, bufferedReader) request, err := ReadRequest(reader, NewAuthenticator(HeaderKeyGenerator(key, iv)), false) if err != nil { @@ -189,6 +194,8 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) { log.Warning("Shadowsocks: Invalid request from ", conn.RemoteAddr(), ": ", err) return } + defer request.Release() + bufferedReader.SetCached(false) userSettings := protocol.GetUserSettings(this.config.Level) timedReader.SetTimeOut(userSettings.PayloadReadTimeout) @@ -218,10 +225,11 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) { writer := crypto.NewCryptionWriter(stream, conn) v2writer := v2io.NewAdaptiveWriter(writer) - defer writer.Release() v2io.Pipe(ray.InboundOutput(), v2writer) ray.InboundOutput().Release() + writer.Release() + v2writer.Release() } writeFinish.Unlock() }()