2890 Commits

Author SHA1 Message Date
Adam Hathcock
67bd9289f9 Merge pull request #1396 from adamhathcock/adam/fix-rar5-decompression-error
Fix RAR5 async decompression corruption in UnpWriteBufAsync
0.50.3
2026-08-01 12:50:05 +01:00
Adam Hathcock
2a2218bcf7 small fix 2026-08-01 12:49:47 +01:00
Adam Hathcock
bc06a9df8b Some clean up 2026-08-01 12:43:44 +01:00
copilot-swe-agent[bot]
cfdfad26b6 Fix RAR5 async decompression corruption in UnpWriteBufAsync
Three bugs in the async version of UnpWriteBuf (used only in the async
decompression path) were causing data corruption when decompressing RAR5
archives containing executable filters (E8/E8E9/ARM) whose blocks spanned
the 4MB write boundary (UNPACK_MAX_WRITE):

1. WrittenFileSize was only incremented inside `if (OutMem != null)`, but
   should always be incremented after ApplyFilter (matching sync behavior).

2. UnpSomeRead = true was missing from the filter processing path.

3. In the NotAllFiltersProcessed else branch (filter intersects write border):
   - WrPtr was not updated to WrittenBorder, corrupting the window pointer
     used to compute WriteBorder on the next flush cycle
   - Remaining filters had NextWindow set to true (inverted logic), when
     sync correctly sets them to false so they are processed next time

All three changes align the async path with the sync UnpWriteBuf logic.
2026-08-01 12:19:09 +01:00
Adam Hathcock
246d968b4d Merge pull request #1393 from adamhathcock/adam/flat-gzip-fix-stream-rewind
Fix SeekableSharpCompressStream.StopRecording() to rewind to recorded…
0.50.2
2026-07-31 16:31:43 +01:00
Adam Hathcock
82c44cb5a5 remove async dispose 2026-07-31 14:52:58 +01:00
Adam Hathcock
a8f6f18843 Fix SeekableSharpCompressStream.StopRecording() to rewind to recorded position
When SeekableSharpCompressStream.StopRecording() was called (e.g. after the tar
probe in GZipFactory.TryOpenReader), it cleared _recordedPosition without seeking
back to it. This left the underlying FileStream at the advanced position reached
during the probe, so the subsequent GZipReader would start reading from the
wrong offset, producing Key=null and 0 extracted bytes.

Fix: seek back to _recordedPosition before clearing it, matching the behavior of
the non-seekable SharpCompressStream.StopRecording() which rewinds _logicalPosition.

Also enhance the existing GZip_ReaderFactory_FlatGZip test to actually verify the
extracted content (not just MoveToNextEntry returns true), and add an async variant.

Closes #1391
2026-07-31 14:21:24 +01:00
Adam Hathcock
6062623dd8 Merge pull request #1376 from adamhathcock/copilot/fix-uncompress-tar-gz-error
Fix tar.gz reader detection for GZip archive entry streams
0.50.1
2026-07-25 17:27:43 +01:00
Adam Hathcock
fe75f28ac9 DataDescriptor should always be non-seekable 2026-07-25 17:08:50 +01:00
Adam Hathcock
ba221b27af Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-24 09:34:18 +01:00
copilot-swe-agent[bot]
3e61a72248 test: broaden transformed stream reader coverage 2026-07-24 07:35:07 +00:00
copilot-swe-agent[bot]
3375aaa90c fix: preserve transformed streams in reader detection 2026-07-24 07:18:02 +00:00
copilot-swe-agent[bot]
0bb5b62842 Initial plan 2026-07-24 07:09:41 +00:00
Adam Hathcock
bb7be935a3 Merge pull request #1372 from adamhathcock/adam/pr-1369
Fixes ZipWriter to be fully forward only
2026-07-23 10:23:12 +01:00
Adam Hathcock
152a66f802 add more tests 2026-07-23 10:17:28 +01:00
Adam Hathcock
4f1d0d32ce Merge pull request #1371 from adamhathcock/copilot/fix-readerfactory-flat-gzip-issue
Fix ArgumentException in ZlibBaseStream when disposing mid-stream GZip probe in ReaderFactory
2026-07-23 10:14:02 +01:00
Adam Hathcock
e3b7a560ba Fix legacy build issue 2026-07-23 10:04:06 +01:00
copilot-swe-agent[bot]
31d12c78d8 Apply remaining changes 2026-07-23 09:00:44 +00:00
Adam Hathcock
02f1a1616a Fixes ZipWriter to be fully forward only 2026-07-23 09:28:04 +01:00
copilot-swe-agent[bot]
b86a871e22 Fix GZipFactory flat gzip probe disposal regression 2026-07-23 08:02:01 +00:00
Adam Hathcock
2faa327ca5 remove RTK hook 2026-07-23 08:53:09 +01:00
copilot-swe-agent[bot]
250cfaba19 Initial plan 2026-07-22 05:28:18 +00:00
Adam Hathcock
073d99153b Merge pull request #1360 from adamhathcock/adam/remove-compressed-tar-archive
Remove compressed tar archive
0.50.0-beta1 0.50.0
2026-07-12 11:55:04 +01:00
Adam Hathcock
581a6dc945 Further advice from Sol 2026-07-12 11:35:46 +01:00
Adam Hathcock
fda3d186c5 more tests and a removal of a test 2026-07-12 11:09:49 +01:00
Adam Hathcock
35aa0ca4ad Merge pull request #1362 from LANCommander/fix-zip64-streaming-corrupted-entry-sizes
Zip: fix Zip64 streaming reader corrupting entry size/CRC and failing on non-seekable streams
2026-07-02 11:44:20 +01:00
Pat Hartl
c59aa78928 Zip: fix Zip64 streaming reader corrupting entry size/CRC and failing on non-seekable streams
The Zip64 branch of the streaming header reader assumed a data descriptor always follows a >=4GB entry. When the entry instead has back-patched sizes (no descriptor), the following header was parsed as descriptor fields, overwriting the entry's correct size/CRC with central-directory 0xFFFFFFFF sentinels and, on non-seekable async streams, leaving the reader misaligned so the next entry threw.

Now it detects a header signature after the entry data and leaves the already-correct metadata untouched, parsing that header normally. The fix has been applied to both the sync and async readers.
2026-06-29 21:35:55 -05:00
Adam Hathcock
b8a7cc18d9 intermediate commit 2026-06-24 16:27:57 +01:00
Adam Hathcock
760f7685f8 First pass of removing Compressed Tar Archive support. Compressed Tars should be done with TarReader only 2026-06-23 15:42:04 +01:00
Adam Hathcock
0e20a10961 Merge pull request #1358 from fiddyschmitt/tolerate-truncated-bzip2-stream
BZip2: add opt-in tolerateTruncatedStream to decode a footerless/partial stream
2026-06-23 12:04:30 +01:00
Fidel
de8ee30b17 BZip2: add opt-in tolerateTruncatedStream to decode a footerless/partial stream
Add a `tolerateTruncatedStream` option (default false) to `BZip2Stream.Create`/`CreateAsync`,
threaded through to `CBZip2InputStream`. When enabled, the decoder accepts a stream that has no
trailing footer - e.g. a truncated stream, or a sub-range of blocks extracted for random access:

- An end-of-input reached while reading a block/footer header (a true block boundary, tracked by
  `expectingBlockStart`) is treated as a normal end of stream instead of throwing
  `ArchiveOperationException("BZip2 compressed file ends unexpectedly")`. EOF in the middle of a
  block, the block CRC, or the Huffman tables still throws.
- The whole-stream combined CRC in the footer is not verified, since a partial decode's running
  combined CRC won't match the stored whole-stream value. Per-block CRCs are still enforced.

Default behaviour is unchanged (the flag defaults to false) and the change is applied symmetrically
to the sync and async read paths.

Tests (BZip2StreamTests):
- a footerless header-only stream decodes to empty with the flag and throws without it;
- a real block followed by end-of-input at the next block boundary decodes with the flag and throws
  without it;
- a corrupted whole-stream combined CRC is tolerated with the flag and fatal without it;
- a complete, well-formed stream still round-trips with the flag set.
All existing BZip2 tests continue to pass.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 13:08:02 +10:00
Adam Hathcock
37a22a8697 Merge pull request #1357 from adamhathcock/adam/crc-impl
more complete CRC checking
2026-06-19 11:58:58 +01:00
Adam Hathcock
49d00034e4 update tests 2026-06-19 11:21:39 +01:00
Adam Hathcock
727d2a79f9 updates from review 2026-06-18 17:06:16 +01:00
Adam Hathcock
e8ee054757 rest of the formats 2026-06-15 17:02:31 +01:00
Adam Hathcock
808524d917 BZip2, GZip and XZ done 2026-06-15 09:59:48 +01:00
Adam Hathcock
e9e05520d6 7Zip and Rar 2026-06-15 09:29:50 +01:00
Adam Hathcock
2866bfbd54 First pass with zip 2026-06-15 09:17:05 +01:00
Adam Hathcock
c36a916c84 add XZ LZMA skill 2026-06-13 15:11:52 +01:00
Adam Hathcock
78a2218982 Handle lzma end marker correctly 2026-06-13 15:09:13 +01:00
Adam Hathcock
2d041e5c76 Fixed XZ block CRC64 computation and added notes on XZ format specifics 2026-06-13 14:31:36 +01:00
Adam Hathcock
160ba0938a review fixes 2026-06-13 10:00:39 +01:00
Adam Hathcock
7814013995 Merge remote-tracking branch 'origin/master' into adam/xz-crc-check 2026-06-13 09:40:39 +01:00
Adam Hathcock
668d5999f0 Merge pull request #1354 from adamhathcock/adam/instance-buffer-size
Instanced buffer size
2026-06-13 09:40:18 +01:00
Adam Hathcock
59d6b82ac5 Cleanup: use some arraypool buffers 2026-06-13 09:37:21 +01:00
Adam Hathcock
4e3dcabbd0 Add basic crc checking for xz 2026-06-13 09:24:04 +01:00
copilot-swe-agent[bot]
323831cfa7 chore: update NuGet lock files to match CI SDK versions (ILLink.Tasks 8.0.27, 10.0.8) 2026-06-12 14:14:22 +00:00
Adam Hathcock
9684e53084 Merge remote-tracking branch 'origin/adam/instance-buffer-size' into adam/instance-buffer-size 2026-06-12 15:10:56 +01:00
Adam Hathcock
68a74e0f45 Try to make things an exact match 2026-06-12 15:10:15 +01:00
Adam Hathcock
61ae3f21c7 fix package lock 2026-06-12 15:01:10 +01:00