Skip to content

Resize compression buffer as needed in decompression [DNET944] #298

Closed
@firebird-automations

Description

@firebird-automations

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

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions