|  | @@ -70,22 +70,14 @@ func NewChunkReader(reader io.Reader, auth *Authenticator) *ChunkReader {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (v *ChunkReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
 | 
	
		
			
				|  |  | -	buffer := buf.New()
 | 
	
		
			
				|  |  | -	if err := buffer.AppendSupplier(buf.ReadFullFrom(v.reader, 2)); err != nil {
 | 
	
		
			
				|  |  | -		buffer.Release()
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	// There is a potential buffer overflow here. Large buffer is 64K bytes,
 | 
	
		
			
				|  |  | -	// while uin16 + 10 will be more than that
 | 
	
		
			
				|  |  | -	length := serial.BytesToUint16(buffer.BytesTo(2)) + AuthSize
 | 
	
		
			
				|  |  | -	if length > buf.Size {
 | 
	
		
			
				|  |  | -		// Theoretically the size of a chunk is 64K, but most Shadowsocks implementations used <4K buffer.
 | 
	
		
			
				|  |  | -		buffer.Release()
 | 
	
		
			
				|  |  | -		buffer = buf.NewSize(uint32(length) + 128)
 | 
	
		
			
				|  |  | +	size, err := serial.ReadUint16(v.reader)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, newError("failed to read size")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	size += AuthSize
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	buffer.Clear()
 | 
	
		
			
				|  |  | -	if err := buffer.AppendSupplier(buf.ReadFullFrom(v.reader, int(length))); err != nil {
 | 
	
		
			
				|  |  | +	buffer := buf.NewSize(uint32(size))
 | 
	
		
			
				|  |  | +	if err := buffer.AppendSupplier(buf.ReadFullFrom(v.reader, int(size))); err != nil {
 | 
	
		
			
				|  |  |  		buffer.Release()
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 |