Decompression via ZlibStream for large message doesn't work #474

Open
opened 2026-01-29 22:12:38 +00:00 by claunia · 0 comments
Owner

Originally created by @DmitryLukyanov on GitHub (Sep 20, 2021).

The below test triggers the following exception in Decompress step for a message bigger than 131072 letters on latest nuget versions. Messages with length less or equal to 131072 letters are decompressed fine. I've checked '0.29.0', '0.28.0', '0.27.0':

Message: 
  SharpCompress.Compressors.Deflate.ZlibException : Bad state (incorrect data check)

Stack Trace: 
  InflateManager.Inflate(FlushType flush)
  ZlibBaseStream.Read(Byte[] buffer, Int32 offset, Int32 count)
  Stream.CopyTo(Stream destination, Int32 bufferSize)
  CompressorsTests.Decompress(Stream input, Stream output) line 135
  CompressorsTests.Zlib_should_read_the_previously_written_message() line 104

but it works fine for versions <= 0.26.0

    [Fact]
    public void Zlib_should_read_the_previously_written_message()
    {
        var message = new string('a', 131073);  // 131073 causes the failure, but 131072 (-1) doesn't
        var bytes = Encoding.ASCII.GetBytes(message);

        using (var inputStream = new MemoryStream(bytes))
        {
            using (var compressedStream = new MemoryStream())
            using (var byteBufferStream = new BufferedStream(inputStream)) // System.IO
            {
                Compress(byteBufferStream, compressedStream, compressionLevel: 1);
                compressedStream.Position = 0;

                using (var decompressedStream = new MemoryStream())
                {
                    Decompress(compressedStream, decompressedStream);

                    byteBufferStream.Position = 0;
                    var result = Encoding.ASCII.GetString(GetBytes(byteBufferStream));
                    result.Should().Be(message);
                }
            }
        }
    }

    public void Compress(Stream input, Stream output, int compressionLevel)
    {
        using (var zlibStream = new ZlibStream(new NonDisposingStream(output), CompressionMode.Compress, (CompressionLevel)compressionLevel))
        {
            zlibStream.FlushMode = FlushType.Sync;
            input.CopyTo(zlibStream);
        }
    }

    public void Decompress(Stream input, Stream output)
    {
        using (var zlibStream = new ZlibStream(new NonDisposingStream(input), CompressionMode.Decompress))
        {
            zlibStream.CopyTo(output);
        }
    }

    byte[] GetBytes(BufferedStream stream)
    {
        byte[] bytes = new byte[stream.Length];
        stream.Read(bytes, 0, (int)stream.Length);
        return bytes;
    }
Originally created by @DmitryLukyanov on GitHub (Sep 20, 2021). The below test triggers the following exception in `Decompress` step for a message bigger than 131072 letters on latest nuget versions. Messages with length less or equal to 131072 letters are decompressed fine. I've checked '0.29.0', '0.28.0', '0.27.0': Message: SharpCompress.Compressors.Deflate.ZlibException : Bad state (incorrect data check) Stack Trace: InflateManager.Inflate(FlushType flush) ZlibBaseStream.Read(Byte[] buffer, Int32 offset, Int32 count) Stream.CopyTo(Stream destination, Int32 bufferSize) CompressorsTests.Decompress(Stream input, Stream output) line 135 CompressorsTests.Zlib_should_read_the_previously_written_message() line 104 but it works fine for versions <= `0.26.0` [Fact] public void Zlib_should_read_the_previously_written_message() { var message = new string('a', 131073); // 131073 causes the failure, but 131072 (-1) doesn't var bytes = Encoding.ASCII.GetBytes(message); using (var inputStream = new MemoryStream(bytes)) { using (var compressedStream = new MemoryStream()) using (var byteBufferStream = new BufferedStream(inputStream)) // System.IO { Compress(byteBufferStream, compressedStream, compressionLevel: 1); compressedStream.Position = 0; using (var decompressedStream = new MemoryStream()) { Decompress(compressedStream, decompressedStream); byteBufferStream.Position = 0; var result = Encoding.ASCII.GetString(GetBytes(byteBufferStream)); result.Should().Be(message); } } } } public void Compress(Stream input, Stream output, int compressionLevel) { using (var zlibStream = new ZlibStream(new NonDisposingStream(output), CompressionMode.Compress, (CompressionLevel)compressionLevel)) { zlibStream.FlushMode = FlushType.Sync; input.CopyTo(zlibStream); } } public void Decompress(Stream input, Stream output) { using (var zlibStream = new ZlibStream(new NonDisposingStream(input), CompressionMode.Decompress)) { zlibStream.CopyTo(output); } } byte[] GetBytes(BufferedStream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, (int)stream.Length); return bytes; }
claunia added the bugup for grabs labels 2026-01-29 22:12:38 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starred/sharpcompress#474