release shadowsocks request

pull/131/head
v2ray 2016-05-01 17:18:02 +02:00
parent 0c6a14c27b
commit b453288e04
2 changed files with 25 additions and 4 deletions

View File

@ -24,6 +24,19 @@ type Request struct {
UDPPayload *alloc.Buffer 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) { func ReadRequest(reader io.Reader, auth *Authenticator, udp bool) (*Request, error) {
buffer := alloc.NewSmallBuffer() buffer := alloc.NewSmallBuffer()
defer buffer.Release() defer buffer.Release()

View File

@ -110,12 +110,13 @@ func (this *Shadowsocks) handlerUDPPayload(payload *alloc.Buffer, source v2net.D
log.Warning("Shadowsocks: Invalid request from ", source, ": ", err) log.Warning("Shadowsocks: Invalid request from ", source, ": ", err)
return return
} }
defer request.Release()
dest := v2net.UDPDestination(request.Address, request.Port) dest := v2net.UDPDestination(request.Address, request.Port)
log.Access(source, dest, log.AccessAccepted, serial.StringLiteral("")) log.Access(source, dest, log.AccessAccepted, serial.StringLiteral(""))
log.Info("Shadowsocks: Tunnelling request to ", dest) 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() defer payload.Release()
response := alloc.NewBuffer().Slice(0, ivLen) response := alloc.NewBuffer().Slice(0, ivLen)
@ -163,9 +164,13 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) {
defer buffer.Release() defer buffer.Release()
timedReader := v2net.NewTimeOutReader(16, conn) timedReader := v2net.NewTimeOutReader(16, conn)
defer timedReader.Release()
bufferedReader := v2io.NewBufferedReader(timedReader)
defer bufferedReader.Release()
ivLen := this.config.Cipher.IVSize() ivLen := this.config.Cipher.IVSize()
_, err := io.ReadFull(timedReader, buffer.Value[:ivLen]) _, err := io.ReadFull(bufferedReader, buffer.Value[:ivLen])
if err != nil { if err != nil {
log.Access(conn.RemoteAddr(), serial.StringLiteral(""), log.AccessRejected, serial.StringLiteral(err.Error())) log.Access(conn.RemoteAddr(), serial.StringLiteral(""), log.AccessRejected, serial.StringLiteral(err.Error()))
log.Error("Shadowsocks: Failed to read IV: ", err) log.Error("Shadowsocks: Failed to read IV: ", err)
@ -181,7 +186,7 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) {
return return
} }
reader := crypto.NewCryptionReader(stream, timedReader) reader := crypto.NewCryptionReader(stream, bufferedReader)
request, err := ReadRequest(reader, NewAuthenticator(HeaderKeyGenerator(key, iv)), false) request, err := ReadRequest(reader, NewAuthenticator(HeaderKeyGenerator(key, iv)), false)
if err != nil { if err != nil {
@ -189,6 +194,8 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) {
log.Warning("Shadowsocks: Invalid request from ", conn.RemoteAddr(), ": ", err) log.Warning("Shadowsocks: Invalid request from ", conn.RemoteAddr(), ": ", err)
return return
} }
defer request.Release()
bufferedReader.SetCached(false)
userSettings := protocol.GetUserSettings(this.config.Level) userSettings := protocol.GetUserSettings(this.config.Level)
timedReader.SetTimeOut(userSettings.PayloadReadTimeout) timedReader.SetTimeOut(userSettings.PayloadReadTimeout)
@ -218,10 +225,11 @@ func (this *Shadowsocks) handleConnection(conn hub.Connection) {
writer := crypto.NewCryptionWriter(stream, conn) writer := crypto.NewCryptionWriter(stream, conn)
v2writer := v2io.NewAdaptiveWriter(writer) v2writer := v2io.NewAdaptiveWriter(writer)
defer writer.Release()
v2io.Pipe(ray.InboundOutput(), v2writer) v2io.Pipe(ray.InboundOutput(), v2writer)
ray.InboundOutput().Release() ray.InboundOutput().Release()
writer.Release()
v2writer.Release()
} }
writeFinish.Unlock() writeFinish.Unlock()
}() }()