Closed
Description
Submitted by: tonim (tonim)
Jira_subtask_outward DNET948
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;
\}
Commits: c1d674c