From d72ed03a4340b2801f09fe745e186dadc1849b47 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Mon, 23 Mar 2020 10:29:00 +0300 Subject: [PATCH] Use pools for obfuscated2 write --- wrappers/stream/obfuscated2.go | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/wrappers/stream/obfuscated2.go b/wrappers/stream/obfuscated2.go index d94b245..8947d13 100644 --- a/wrappers/stream/obfuscated2.go +++ b/wrappers/stream/obfuscated2.go @@ -1,9 +1,11 @@ package stream import ( + "bytes" "crypto/cipher" "fmt" "net" + "sync" "time" "go.uber.org/zap" @@ -11,6 +13,26 @@ import ( "github.com/9seconds/mtg/conntypes" ) +var ( + poolWrapperObfuscated2WritePool = sync.Pool{ + New: func() interface{} { + return &bytes.Buffer{} + }, + } +) + +func poolWrapperObfuscated2WritePoolAcquire(size int) *bytes.Buffer { + buf := poolWrapperObfuscated2WritePool.Get().(*bytes.Buffer) + buf.Grow(size) + + return buf +} + +func poolWrapperObfuscated2WritePoolRelease(buf *bytes.Buffer) { + buf.Reset() + poolWrapperObfuscated2WritePool.Put(buf) +} + type wrapperObfuscated2 struct { encryptor cipher.Stream decryptor cipher.Stream @@ -40,7 +62,10 @@ func (w *wrapperObfuscated2) Read(p []byte) (int, error) { } func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) { - buf := make([]byte, len(p)) + buffer := poolWrapperObfuscated2WritePoolAcquire(len(p)) + defer poolWrapperObfuscated2WritePoolRelease(buffer) + + buf := buffer.Bytes() copy(buf, p) w.encryptor.XORKeyStream(buf, buf) @@ -48,7 +73,10 @@ func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, } func (w *wrapperObfuscated2) Write(p []byte) (int, error) { - buf := make([]byte, len(p)) + buffer := poolWrapperObfuscated2WritePoolAcquire(len(p)) + defer poolWrapperObfuscated2WritePoolRelease(buffer) + + buf := buffer.Bytes() copy(buf, p) w.encryptor.XORKeyStream(buf, buf)