1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-07-01 19:45:24 +00:00

fix buffer leak in multi buffer

This commit is contained in:
Darien Raymond 2017-11-07 11:40:12 +01:00
parent d1e7e7002f
commit ccf1fb6616
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169

View File

@ -4,6 +4,7 @@ import (
"io" "io"
"net" "net"
"v2ray.com/core/common"
"v2ray.com/core/common/errors" "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) { func ReadAllToBytes(reader io.Reader) ([]byte, error) {
mb, err := ReadAllToMultiBuffer(reader) mb, err := ReadAllToMultiBuffer(reader)
if err != nil { if err != nil {
return nil, err return nil, err
} }
b := make([]byte, mb.Len()) b := make([]byte, mb.Len())
mb.Read(b) common.Must2(mb.Read(b))
mb.Release() mb.Release()
return b, nil return b, nil
} }
@ -131,11 +133,12 @@ func (mb MultiBuffer) IsEmpty() bool {
} }
// Release releases all Buffers in the MultiBuffer. // Release releases all Buffers in the MultiBuffer.
func (mb MultiBuffer) Release() { func (mb *MultiBuffer) Release() {
for i, b := range mb { for i, b := range *mb {
b.Release() 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. // 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() sliceSize += b.Len()
slice.Append(b) slice.Append(b)
(*mb)[i] = nil
} }
*mb = (*mb)[endIndex:] *mb = (*mb)[endIndex:]
return slice return slice
@ -168,6 +172,7 @@ func (mb *MultiBuffer) SplitFirst() *Buffer {
return nil return nil
} }
b := (*mb)[0] b := (*mb)[0]
(*mb)[0] = nil
*mb = (*mb)[1:] *mb = (*mb)[1:]
return b return b
} }