1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-29 18:45:23 +00:00

prevent empty read in Reader

This commit is contained in:
Darien Raymond 2018-03-29 10:40:18 +02:00
parent fc7da93d06
commit babd0107cf
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169

View File

@ -23,15 +23,19 @@ const xlSize = 128 * 1024
func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) { func (r *BytesToBufferReader) readSmall() (MultiBuffer, error) {
b := New() b := New()
err := b.Reset(ReadFrom(r.Reader)) for {
if b.IsFull() { err := b.Reset(ReadFrom(r.Reader))
r.buffer = newBytes(Size + 1) if b.IsFull() {
r.buffer = newBytes(Size + 1)
}
if !b.IsEmpty() {
return NewMultiBufferValue(b), nil
}
if err != nil {
b.Release()
return nil, err
}
} }
if !b.IsEmpty() {
return NewMultiBufferValue(b), nil
}
b.Release()
return nil, err
} }
// ReadMultiBuffer implements Reader. // ReadMultiBuffer implements Reader.
@ -40,22 +44,26 @@ func (r *BytesToBufferReader) ReadMultiBuffer() (MultiBuffer, error) {
return r.readSmall() return r.readSmall()
} }
nBytes, err := r.Reader.Read(r.buffer) for {
if nBytes > 0 { nBytes, err := r.Reader.Read(r.buffer)
mb := NewMultiBufferCap(nBytes/Size + 1) if nBytes > 0 {
mb.Write(r.buffer[:nBytes]) mb := NewMultiBufferCap(nBytes/Size + 1)
if nBytes == len(r.buffer) && nBytes < xlSize { mb.Write(r.buffer[:nBytes])
freeBytes(r.buffer) if nBytes == len(r.buffer) && nBytes < xlSize {
r.buffer = newBytes(uint32(nBytes) + 1) freeBytes(r.buffer)
} else if nBytes < Size { r.buffer = newBytes(uint32(nBytes) + 1)
} else if nBytes < Size {
freeBytes(r.buffer)
r.buffer = nil
}
return mb, nil
}
if err != nil {
freeBytes(r.buffer) freeBytes(r.buffer)
r.buffer = nil r.buffer = nil
return nil, err
} }
return mb, nil
} }
freeBytes(r.buffer)
r.buffer = nil
return nil, err
} }
// BufferedReader is a Reader that keeps its internal buffer. // BufferedReader is a Reader that keeps its internal buffer.