From fda85506c8c2f79adfc12fc5a9c15475eb97ca05 Mon Sep 17 00:00:00 2001
From: Darien Raymond <admin@v2ray.com>
Date: Fri, 9 Mar 2018 11:26:00 +0100
Subject: [PATCH] reuse buffer

---
 proxy/blackhole/config.go        |  2 +-
 proxy/shadowsocks/protocol.go    |  4 ++--
 proxy/socks/protocol.go          | 19 ++++++++++++++-----
 proxy/vmess/encoding/commands.go |  2 +-
 4 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/proxy/blackhole/config.go b/proxy/blackhole/config.go
index 5bfd3290..89c8df43 100644
--- a/proxy/blackhole/config.go
+++ b/proxy/blackhole/config.go
@@ -27,7 +27,7 @@ func (*NoneResponse) WriteTo(buf.Writer) {}
 
 // WriteTo implements ResponseConfig.WriteTo().
 func (*HTTPResponse) WriteTo(writer buf.Writer) {
-	b := buf.NewLocal(512)
+	b := buf.New()
 	common.Must(b.AppendSupplier(serial.WriteString(http403response)))
 	writer.WriteMultiBuffer(buf.NewMultiBufferValue(b))
 }
diff --git a/proxy/shadowsocks/protocol.go b/proxy/shadowsocks/protocol.go
index 4ad68a88..a52e310f 100644
--- a/proxy/shadowsocks/protocol.go
+++ b/proxy/shadowsocks/protocol.go
@@ -35,7 +35,7 @@ func ReadTCPSession(user *protocol.User, reader io.Reader) (*protocol.RequestHea
 	}
 	account := rawAccount.(*MemoryAccount)
 
-	buffer := buf.NewLocal(512)
+	buffer := buf.New()
 	defer buffer.Release()
 
 	ivLen := account.Cipher.IVSize()
@@ -149,7 +149,7 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri
 		return nil, newError("failed to create encoding stream").Base(err).AtError()
 	}
 
-	header := buf.NewLocal(512)
+	header := buf.New()
 
 	if err := addrParser.WriteAddressPort(header, request.Address, request.Port); err != nil {
 		return nil, newError("failed to write address").Base(err)
diff --git a/proxy/socks/protocol.go b/proxy/socks/protocol.go
index 2090296a..8aba9c5c 100644
--- a/proxy/socks/protocol.go
+++ b/proxy/socks/protocol.go
@@ -46,7 +46,9 @@ type ServerSession struct {
 }
 
 func (s *ServerSession) Handshake(reader io.Reader, writer io.Writer) (*protocol.RequestHeader, error) {
-	buffer := buf.NewLocal(512)
+	buffer := buf.New()
+	defer buffer.Release()
+
 	request := new(protocol.RequestHeader)
 
 	if err := buffer.AppendSupplier(buf.ReadFullFrom(reader, 2)); err != nil {
@@ -177,7 +179,7 @@ func (s *ServerSession) Handshake(reader io.Reader, writer io.Writer) (*protocol
 }
 
 func readUsernamePassword(reader io.Reader) (string, string, error) {
-	buffer := buf.NewLocal(512)
+	buffer := buf.New()
 	defer buffer.Release()
 
 	if err := buffer.Reset(buf.ReadFullFrom(reader, 2)); err != nil {
@@ -234,7 +236,9 @@ func writeSocks5AuthenticationResponse(writer io.Writer, version byte, auth byte
 }
 
 func writeSocks5Response(writer io.Writer, errCode byte, address net.Address, port net.Port) error {
-	buffer := buf.NewLocal(64)
+	buffer := buf.New()
+	defer buffer.Release()
+
 	buffer.AppendBytes(socks5Version, errCode, 0x00 /* reserved */)
 	if err := addrParser.WriteAddressPort(buffer, address, port); err != nil {
 		return err
@@ -245,7 +249,9 @@ func writeSocks5Response(writer io.Writer, errCode byte, address net.Address, po
 }
 
 func writeSocks4Response(writer io.Writer, errCode byte, address net.Address, port net.Port) error {
-	buffer := buf.NewLocal(32)
+	buffer := buf.New()
+	defer buffer.Release()
+
 	buffer.AppendBytes(0x00, errCode)
 	common.Must(buffer.AppendSupplier(serial.WriteUint16(port.Value())))
 	buffer.Append(address.IP())
@@ -282,6 +288,7 @@ func EncodeUDPPacket(request *protocol.RequestHeader, data []byte) (*buf.Buffer,
 	b := buf.New()
 	b.AppendBytes(0, 0, 0 /* Fragment */)
 	if err := addrParser.WriteAddressPort(b, request.Address, request.Port); err != nil {
+		b.Release()
 		return nil, err
 	}
 	b.Append(data)
@@ -338,7 +345,9 @@ func ClientHandshake(request *protocol.RequestHeader, reader io.Reader, writer i
 		authByte = byte(authPassword)
 	}
 
-	b := buf.NewLocal(512)
+	b := buf.New()
+	defer b.Release()
+
 	b.AppendBytes(socks5Version, 0x01, authByte)
 	if authByte == authPassword {
 		rawAccount, err := request.User.GetTypedAccount()
diff --git a/proxy/vmess/encoding/commands.go b/proxy/vmess/encoding/commands.go
index eb25139a..1b61f777 100644
--- a/proxy/vmess/encoding/commands.go
+++ b/proxy/vmess/encoding/commands.go
@@ -32,7 +32,7 @@ func MarshalCommand(command interface{}, writer io.Writer) error {
 		return ErrUnknownCommand
 	}
 
-	buffer := buf.NewLocal(512)
+	buffer := buf.New()
 	defer buffer.Release()
 
 	err := factory.Marshal(command, buffer)