mirror of
https://github.com/nadoo/glider.git
synced 2025-04-21 19:52:07 +08:00
fix(vmess): panic caused by length exceeded
This commit is contained in:
parent
b502b129b7
commit
91f41c6dfa
@ -79,54 +79,53 @@ func AEADReader(r io.Reader, aead cipher.AEAD, iv []byte, chunkSizeDecoder Chunk
|
|||||||
return ar
|
return ar
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *aeadReader) read(p []byte) (int, error) {
|
func (r *aeadReader) readChunkPool() ([]byte, error) {
|
||||||
if _, err := io.ReadFull(r.Reader, p[:r.chunkSizeDecoder.SizeBytes()]); err != nil {
|
bSize := pool.GetBuffer(int(r.chunkSizeDecoder.SizeBytes()))
|
||||||
return 0, err
|
defer pool.PutBuffer(bSize)
|
||||||
|
if _, err := io.ReadFull(r.Reader, bSize); err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
size, err := r.chunkSizeDecoder.Decode(p[:r.chunkSizeDecoder.SizeBytes()])
|
size, err := r.chunkSizeDecoder.Decode(bSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
p = p[:size]
|
chunk := pool.GetBuffer(int(size))
|
||||||
if _, err := io.ReadFull(r.Reader, p); err != nil {
|
if _, err := io.ReadFull(r.Reader, chunk); err != nil {
|
||||||
return 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
binary.BigEndian.PutUint16(r.nonce[:2], r.count)
|
binary.BigEndian.PutUint16(r.nonce[:2], r.count)
|
||||||
_, err = r.Open(p[:0], r.nonce[:r.NonceSize()], p, nil)
|
_, err = r.Open(chunk[:0], r.nonce[:r.NonceSize()], chunk, nil)
|
||||||
r.count++
|
r.count++
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return int(size) - r.Overhead(), nil
|
return chunk[:int(size)-r.Overhead()], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *aeadReader) Read(p []byte) (int, error) {
|
func (r *aeadReader) Read(p []byte) (int, error) {
|
||||||
if r.buf == nil {
|
if r.buf != nil {
|
||||||
if len(p) >= chunkSize {
|
n := copy(p, r.buf[r.offset:])
|
||||||
return r.read(p)
|
r.offset += n
|
||||||
|
if r.offset >= len(r.buf) {
|
||||||
|
pool.PutBuffer(r.buf)
|
||||||
|
r.buf = nil
|
||||||
}
|
}
|
||||||
|
return n, nil
|
||||||
buf := pool.GetBuffer(chunkSize)
|
|
||||||
n, err := r.read(buf)
|
|
||||||
if err != nil || n == 0 {
|
|
||||||
pool.PutBuffer(buf)
|
|
||||||
return 0, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r.buf = buf[:n]
|
|
||||||
r.offset = 0
|
|
||||||
}
|
}
|
||||||
|
chunk, err := r.readChunkPool()
|
||||||
n := copy(p, r.buf[r.offset:])
|
if err != nil {
|
||||||
r.offset += n
|
return 0, err
|
||||||
if r.offset == len(r.buf) {
|
}
|
||||||
pool.PutBuffer(r.buf)
|
n := copy(p, chunk)
|
||||||
r.buf = nil
|
if len(chunk) > len(p) {
|
||||||
|
r.buf = chunk
|
||||||
|
r.offset = len(p)
|
||||||
|
} else {
|
||||||
|
pool.PutBuffer(chunk)
|
||||||
}
|
}
|
||||||
|
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user