diff --git a/src/SharpCompress/Compressors/LZMA/LzmaStream.cs b/src/SharpCompress/Compressors/LZMA/LzmaStream.cs index 701b8e64..8e7d4adc 100644 --- a/src/SharpCompress/Compressors/LZMA/LzmaStream.cs +++ b/src/SharpCompress/Compressors/LZMA/LzmaStream.cs @@ -207,14 +207,23 @@ public override int Read(byte[] buffer, int offset, int count) if (_availableBytes == 0 && !_uncompressedChunk) { - _rangeDecoder.ReleaseStream(); + // Check range corruption scenario if ( !_rangeDecoder.IsFinished || (_rangeDecoderLimit >= 0 && _rangeDecoder._total != _rangeDecoderLimit) ) { - throw new DataErrorException(); + // Stream might have End Of Stream marker + _outWindow.SetLimit(toProcess + 1); + if (!_decoder.Code(_dictionarySize, _outWindow, _rangeDecoder)) + { + _rangeDecoder.ReleaseStream(); + throw new DataErrorException(); + } } + + _rangeDecoder.ReleaseStream(); + _inputPosition += _rangeDecoder._total; if (_outWindow.HasPending) { diff --git a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs index e77e288c..184559d1 100644 --- a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs +++ b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs @@ -135,6 +135,9 @@ public void SevenZipArchive_ZSTD_Split() => ) ); + [Fact] + public void SevenZipArchive_EOS_FileRead() => ArchiveFileRead("7Zip.eos.7z"); + [Fact] public void SevenZipArchive_Delta_FileRead() => ArchiveFileRead("7Zip.delta.7z"); diff --git a/tests/TestArchives/Archives/7Zip.eos.7z b/tests/TestArchives/Archives/7Zip.eos.7z new file mode 100644 index 00000000..2fe951ad Binary files /dev/null and b/tests/TestArchives/Archives/7Zip.eos.7z differ