@@ -48,6 +48,7 @@ internal class XdrStream : Stream
4848 private long _position ;
4949 private List < byte > _outputBuffer ;
5050 private Queue < byte > _inputBuffer ;
51+ private byte [ ] _readBuffer ;
5152 private byte [ ] _smallBuffer ;
5253 private Ionic . Zlib . ZlibCodec _deflate ;
5354 private Ionic . Zlib . ZlibCodec _inflate ;
@@ -122,6 +123,7 @@ public XdrStream(Stream innerStream, Charset charset, bool compression, bool own
122123 _position = 0 ;
123124 _outputBuffer = new List < byte > ( PreferredBufferSize ) ;
124125 _inputBuffer = new Queue < byte > ( PreferredBufferSize ) ;
126+ _readBuffer = new byte [ PreferredBufferSize ] ;
125127 _smallBuffer = new byte [ 8 ] ;
126128 if ( _compression )
127129 {
@@ -160,7 +162,8 @@ public override void Flush()
160162 var count = buffer . Length ;
161163 if ( _compression )
162164 {
163- HandleCompression ( ref buffer , ref count ) ;
165+ count = HandleCompression ( buffer , count ) ;
166+ buffer = _compressionBuffer ;
164167 }
165168 try
166169 {
@@ -203,7 +206,7 @@ public override int Read(byte[] buffer, int offset, int count)
203206
204207 if ( _inputBuffer . Count < count )
205208 {
206- var readBuffer = new byte [ PreferredBufferSize ] ;
209+ var readBuffer = _readBuffer ;
207210 var read = default ( int ) ;
208211 try
209212 {
@@ -218,7 +221,8 @@ public override int Read(byte[] buffer, int offset, int count)
218221 {
219222 if ( _compression )
220223 {
221- HandleDecompression ( ref readBuffer , ref read ) ;
224+ read = HandleDecompression ( readBuffer , read ) ;
225+ readBuffer = _compressionBuffer ;
222226 }
223227 WriteToInputBuffer ( readBuffer , read ) ;
224228 }
@@ -235,7 +239,7 @@ public override async Task<int> ReadAsync(byte[] buffer, int offset, int count,
235239
236240 if ( _inputBuffer . Count < count )
237241 {
238- var readBuffer = new byte [ PreferredBufferSize ] ;
242+ var readBuffer = _readBuffer ;
239243 var read = default ( int ) ;
240244 try
241245 {
@@ -250,7 +254,8 @@ public override async Task<int> ReadAsync(byte[] buffer, int offset, int count,
250254 {
251255 if ( _compression )
252256 {
253- HandleDecompression ( ref readBuffer , ref read ) ;
257+ read = HandleDecompression ( readBuffer , read ) ;
258+ readBuffer = _compressionBuffer ;
254259 }
255260 WriteToInputBuffer ( readBuffer , read ) ;
256261 }
@@ -737,7 +742,7 @@ private void WriteToInputBuffer(byte[] data, int count)
737742 }
738743 }
739744
740- private void HandleDecompression ( ref byte [ ] buffer , ref int count )
745+ private int HandleDecompression ( byte [ ] buffer , int count )
741746 {
742747 _inflate . OutputBuffer = _compressionBuffer ;
743748 _inflate . AvailableBytesOut = _compressionBuffer . Length ;
@@ -750,25 +755,23 @@ private void HandleDecompression(ref byte[] buffer, ref int count)
750755 throw new IOException ( $ "Error '{ rc } ' while decompressing the data.") ;
751756 if ( _inflate . AvailableBytesIn != 0 )
752757 throw new IOException ( "Decompression buffer too small." ) ;
753- buffer = _compressionBuffer ;
754- count = _inflate . NextOut ;
758+ return _inflate . NextOut ;
755759 }
756760
757- private void HandleCompression ( ref byte [ ] buffer , ref int count )
761+ private int HandleCompression ( byte [ ] buffer , int count )
758762 {
759763 _deflate . OutputBuffer = _compressionBuffer ;
760764 _deflate . AvailableBytesOut = _compressionBuffer . Length ;
761765 _deflate . NextOut = 0 ;
762766 _deflate . InputBuffer = buffer ;
763- _deflate . AvailableBytesIn = buffer . Length ;
767+ _deflate . AvailableBytesIn = count ;
764768 _deflate . NextIn = 0 ;
765769 var rc = _deflate . Deflate ( Ionic . Zlib . FlushType . Sync ) ;
766770 if ( rc != Ionic . Zlib . ZlibConstants . Z_OK )
767771 throw new IOException ( $ "Error '{ rc } ' while compressing the data.") ;
768772 if ( _deflate . AvailableBytesIn != 0 )
769773 throw new IOException ( "Compression buffer too small." ) ;
770- buffer = _compressionBuffer ;
771- count = _deflate . NextOut ;
774+ return _deflate . NextOut ;
772775 }
773776
774777 private readonly static byte [ ] PadArray = new byte [ ] { 0 , 0 , 0 , 0 } ;
0 commit comments