Compression buffer too small error thrown
-----------------------------------------

                 Key: DNET-944
                 URL: http://tracker.firebirdsql.org/browse/DNET-944
             Project: .NET Data provider
          Issue Type: Bug
          Components: ADO.NET Provider
    Affects Versions: vNext
         Environment: Firebird.net provider selecting rows, more frequent 
selecting data containing blobs, for example SELECT * FROM RDB$PROCEDURES on a 
database width some procedures. You can reproduce the bug easily setting the 
CompressionBufferSize to 8192 for example
            Reporter: tonim
            Assignee: Jiri Cincura


Any environment, when selecting Compression=true in Connection string, more 
common selecting packetsize=32000

A big constant decompression buffer size is defined in FirebirdNetwordStream. 
                const int CompressionBufferSize = 1 *  1024 * 1024;

Any decompression bigger than this size throws an exception in 
HandleDecompression function.

I provide a tested fix, the buffer will grow dynamically, depending on the 
uncompressed size.

                // There is no need to define a big buffer size, it will grow 
as needed
                const int CompressionBufferSize = 32000;



                int HandleDecompression(byte[] buffer, int count)
                {
                        _decompressor.OutputBuffer = _compressionBuffer;
                        _decompressor.InputBuffer = buffer;
                        _decompressor.NextOut = 0;
                        _decompressor.NextIn = 0;
                        _decompressor.AvailableBytesIn = count;
                        do
                        {
                                // Double the buffer size until the 
decompression fits in the output buffer
                                _decompressor.OutputBuffer = _compressionBuffer;
                                _decompressor.AvailableBytesOut = 
_compressionBuffer.Length - _decompressor.NextOut;
                                var rc = 
_decompressor.Inflate(Ionic.Zlib.FlushType.None);
                                if (rc != Ionic.Zlib.ZlibConstants.Z_OK)
                                        throw new IOException($"Error '{rc}' 
while decompressing the data.");
                                if (_decompressor.AvailableBytesIn != 0)
                                {
                                        byte[] newCompressionBuffer = new 
byte[_compressionBuffer.Length * 2];
                                        Array.Copy(_compressionBuffer, 
newCompressionBuffer, _decompressor.NextOut);
                                        _compressionBuffer = 
newCompressionBuffer;
                                }
                        } while (_decompressor.AvailableBytesIn != 0);
                        return _decompressor.NextOut;
                }




-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


_______________________________________________
Firebird-net-provider mailing list
Firebird-net-provider@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/firebird-net-provider

Reply via email to