From ccf1fb66166785636f392afb4e918d7b1539898c Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 7 Nov 2017 11:40:12 +0100 Subject: [PATCH] fix buffer leak in multi buffer --- common/buf/multi_buffer.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/common/buf/multi_buffer.go b/common/buf/multi_buffer.go index f74228081..b0babf881 100644 --- a/common/buf/multi_buffer.go +++ b/common/buf/multi_buffer.go @@ -4,6 +4,7 @@ import ( "io" "net" + "v2ray.com/core/common" "v2ray.com/core/common/errors" ) @@ -34,13 +35,14 @@ func ReadAllToMultiBuffer(reader io.Reader) (MultiBuffer, error) { } } +// ReadAllToBytes reads all content from the reader into a byte array, until EOF. func ReadAllToBytes(reader io.Reader) ([]byte, error) { mb, err := ReadAllToMultiBuffer(reader) if err != nil { return nil, err } b := make([]byte, mb.Len()) - mb.Read(b) + common.Must2(mb.Read(b)) mb.Release() return b, nil } @@ -131,11 +133,12 @@ func (mb MultiBuffer) IsEmpty() bool { } // Release releases all Buffers in the MultiBuffer. -func (mb MultiBuffer) Release() { - for i, b := range mb { +func (mb *MultiBuffer) Release() { + for i, b := range *mb { b.Release() - mb[i] = nil + (*mb)[i] = nil } + *mb = (*mb)[:0] } // ToNetBuffers converts this MultiBuffer to net.Buffers. The return net.Buffers points to the same content of the MultiBuffer. @@ -158,6 +161,7 @@ func (mb *MultiBuffer) SliceBySize(size int) MultiBuffer { } sliceSize += b.Len() slice.Append(b) + (*mb)[i] = nil } *mb = (*mb)[endIndex:] return slice @@ -168,6 +172,7 @@ func (mb *MultiBuffer) SplitFirst() *Buffer { return nil } b := (*mb)[0] + (*mb)[0] = nil *mb = (*mb)[1:] return b }