Browse Source

release shadowsocks request

v2ray 9 years ago
parent
commit
b453288e04
2 changed files with 25 additions and 4 deletions
  1. 13 0
      proxy/shadowsocks/protocol.go
  2. 12 4
      proxy/shadowsocks/shadowsocks.go

+ 13 - 0
proxy/shadowsocks/protocol.go

@@ -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()

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