1651 Commits

Author SHA1 Message Date
Puk06
37c0f5aec5 fix: Change LeaveStreamOpen default from true to false
As of v0.21, the library is documented to close wrapped streams by default.
However, the ReaderOptions.LeaveStreamOpen property defaulted to true, which
contradicted the documented behavior and caused file locks when deleting
archives after extraction.

Changes:
- Set LeaveStreamOpen = false as the default (consistent with v0.21 design)
- Updated ReaderOptions.cs with comprehensive documentation explaining:
  * File-based vs caller-provided stream handling
  * When to use LeaveStreamOpen = true
  * Usage examples for both scenarios
- Updated AGENTS.md Stream Handling Rules section with:
  * Clear explanation of default disposal behavior
  * Overload differences (file-based vs stream-based)
  * Guidance on using ForExternalStream preset

This ensures the implementation matches the documented behavior and prevents
unexpected file locking issues during archive deletion.

Fixes: File deletion failures after archive extraction
2026-04-20 22:32:36 +09:00
Adam Hathcock
2a62f4dfe2 Add global pax support to TarArchive 2026-04-20 08:26:11 +01:00
Adam Hathcock
823afd4fd5 fixed header format behavior 2026-04-20 07:58:29 +01:00
Adam Hathcock
1ba1966e1c Merge remote-tracking branch 'origin/master' into adam/tar-pax
# Conflicts:
#	src/SharpCompress/Archives/Tar/TarArchive.Async.cs
#	src/SharpCompress/Archives/Tar/TarArchive.cs
#	src/SharpCompress/packages.lock.json
2026-04-19 15:19:19 +01:00
Adam Hathcock
6105373d7f First pass of pax implementation 2026-04-19 15:17:35 +01:00
copilot-swe-agent[bot]
f8485b0e8c Compute CRC without GetBuffer() in SevenZipWriter to avoid allocation
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/77f37cc4-3538-4df1-a816-aa7391065878

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-19 11:33:40 +00:00
copilot-swe-agent[bot]
49a7e15a8b Add EnsureNotClosed() to Flush and FlushAsync in PooledMemoryStream
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/0ce9533f-f529-4c07-b641-6bf0883a0643

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-19 11:20:34 +00:00
Adam Hathcock
e0ccbbb7c7 Update src/SharpCompress/IO/PooledMemoryStream.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-19 12:19:06 +01:00
Adam Hathcock
891d1268fb Update src/SharpCompress/IO/PooledMemoryStream.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-19 12:18:47 +01:00
Adam Hathcock
ad3c5dafd7 update tests 2026-04-19 12:11:50 +01:00
Adam Hathcock
e29670e55f Merge branch 'master' into adam/pooledmemorystream 2026-04-19 11:43:24 +01:00
Adam Hathcock
14b0fd012c Merge pull request #1274 from adamhathcock/adam/master-release
Release to Master
2026-04-19 11:32:16 +01:00
Adam Hathcock
51acd43b16 Merge branch 'release' into adam/master-release 2026-04-19 11:25:39 +01:00
Copilot
20932b81b5 Fix SevenZipArchive.IsSolidAsync() always returning false (#1284)
* Initial plan

* Fix IsSolidAsync() returning false for 7z solid archives

SevenZipArchive was missing an override for IsSolidAsync(), so the
base class default (always returning false) was used. Added an override
that uses the same logic as the sync IsSolid property: load entries
asynchronously and check if any folder has more than one file.

Also updated existing async tests to use IsSolidAsync() instead of
casting to SevenZipArchive to call the sync IsSolid, and added a new
SevenZipArchive_TestSolidDetectionAsync test that mirrors the existing
sync SevenZipArchive_TestSolidDetection test.

Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/60f8daec-e784-4845-a65c-5a493fbb53ef

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-13 16:59:23 +01:00
aromaa
4d774c6a7a Fix setting invalid access time fails extraction 2026-04-10 15:56:48 +03:00
Adam Hathcock
d1e6173b50 remove contiguous buffer tracking and added overrenting array pool test 2026-04-05 15:25:33 +01:00
Adam Hathcock
e7cacdd7ee don't resize ring buffer 2026-04-05 15:19:44 +01:00
Adam Hathcock
fb78598516 implement GetBuffer with non-pooled array creation 2026-04-05 15:16:00 +01:00
Adam Hathcock
bfe78249fc remove net5 from target frameworks to avoid issues 2026-04-05 14:47:41 +01:00
Adam Hathcock
c25fec313e fix PooledMemoryStream.cs 2026-04-05 14:39:15 +01:00
copilot-swe-agent[bot]
8c4fed373b Remove try/catch from async overloads and fix CA1725 parameter naming in PooledMemoryStream
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/1f2c3c48-1112-43f1-82ce-efb157fbe0d5

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-05 13:21:54 +00:00
Adam Hathcock
5e7644bd18 Update src/SharpCompress/IO/PooledMemoryStream.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-05 14:11:48 +01:00
Adam Hathcock
6b9a3f8b69 Update src/SharpCompress/Compressors/PPMd/PpmdStream.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-05 14:10:17 +01:00
Adam Hathcock
db9bdb20bd Update src/SharpCompress/IO/PooledMemoryStream.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-05 14:09:58 +01:00
Adam Hathcock
2bf007542a cleaned up PooledMemoryStream.cs 2026-04-04 11:10:43 +01:00
Adam Hathcock
a26198a6b0 use pooled memory streams for better performance 2026-04-04 11:04:51 +01:00
Adam Hathcock
9db27dfc2b fix build 2026-04-04 10:53:12 +01:00
Adam Hathcock
b326b719bc Merge branch 'release' into adam/master-release
# Conflicts:
#	src/SharpCompress/packages.lock.json
2026-04-04 10:50:12 +01:00
Adam Hathcock
817bd2a95e First pass of implementation 2026-04-04 10:44:23 +01:00
Adam Hathcock
5758b08236 Merge pull request #1272 from adamhathcock/copilot/fix-decompression-bomb-and-crash-bugs
Fix fuzzer-found decompression bomb and crash bugs
2026-04-03 13:05:55 +01:00
copilot-swe-agent[bot]
01fee28759 ShrinkStream: add uncompressedSize bounds check, remove unused CreateAsync params
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/9ed10d73-ebf8-45d3-8d25-d5aa1f4989e7

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-03 11:49:45 +00:00
Adam Hathcock
bd0d1cfba8 remove more extra stuff 2026-04-03 12:47:04 +01:00
copilot-swe-agent[bot]
9ce6ec8d6f Dynamic ring buffer sizing for BZip2 and ZStandard on non-seekable streams
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/b115976a-5d8a-412e-a462-72b4531f2d0a

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-02 11:01:08 +00:00
copilot-swe-agent[bot]
669fbed62b Dynamic ring buffer sizing for BZip2 and ZStandard on non-seekable streams
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/b115976a-5d8a-412e-a462-72b4531f2d0a

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-02 10:56:50 +00:00
Adam Hathcock
16903bdecb clean up shrink stream to ensure correctness 2026-04-02 11:48:01 +01:00
copilot-swe-agent[bot]
58bec11b2c Fix decompression bomb and crash bugs (fuzzer-found)
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/84b02876-db79-41ed-875b-f1c7dbe5d8e2

Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-04-02 09:49:27 +00:00
Adam Hathcock
512f101d26 Merge remote-tracking branch 'origin/master' into coderb/master 2026-03-28 09:57:33 +00:00
Adam Hathcock
fefeed0601 Merge pull request #1267 from adamhathcock/release
Release to master
2026-03-28 09:53:45 +00:00
root
265d99095b Fix three BLAKE2sp correctness bugs and eliminate allocations in hot path
1. Fix off-by-one in Update(BLAKE2SP): pos was masked with 448 (64×7)
   instead of 511 (64×8−1), causing incorrect leaf assignment when update
   chunks are not multiples of 64 bytes. This produced wrong hashes
   whenever streaming reads didn't align to 64-byte boundaries.

2. Fix double-finalization when Read() is called again after returning 0.
   Final() was called unconditionally on each EOF read, re-running
   compression on an already-finalized state and corrupting the hash.
   EnsureHash() guards with a null-check and is idempotent; both sync
   and async Read paths share the fix. _blake2sp is set to null after
   finalization so any erroneous post-final calls fail fast rather than
   silently corrupting state.

3. Fix false-positive CRC check when stream is not fully drained.
   _hash was initialized to fileHeader.FileCrc in the constructor, so
   GetCrc() returned the expected CRC rather than the computed one if
   the stream was abandoned early. The check would then compare the
   expected hash against itself and always succeed, silently accepting
   a corrupt or incomplete file. _hash is now null until the stream is
   fully read; GetCrc() throws if called early rather than returning a
   misleading value.

Additional changes:
- Compress: stackalloc m/v arrays instead of heap; LE fast path via
  MemoryMarshal.Cast replaces 16 BitConverter.ToUInt32 calls per block
- Final(BLAKE2S): write directly to Span<byte>, eliminating MemoryStream
  and BitConverter.GetBytes allocations; 8 leaf digests now stackalloc'd
- Inner classes and fields: private, sealed, readonly where applicable
2026-03-27 13:34:00 -04:00
copilot-swe-agent[bot]
243bf00308 Address code review: fix HbCreateDecodeTables off-by-one, rename test helper
Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/3037a2f7-f243-4261-802f-e8c83b4d6722
2026-03-23 10:03:14 +00:00
copilot-swe-agent[bot]
f038652d3b Fix multiple decompressor crashes on malformed input (IOOB, DivByZero, NullRef)
Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/3037a2f7-f243-4261-802f-e8c83b4d6722
2026-03-23 09:55:55 +00:00
copilot-swe-agent[bot]
f608957c7a Initial plan: fix multiple decompressor crashes on malformed input
Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
Agent-Logs-Url: https://github.com/adamhathcock/sharpcompress/sessions/3037a2f7-f243-4261-802f-e8c83b4d6722
2026-03-23 09:37:58 +00:00
Adam Hathcock
d7f9d25b74 Merge pull request #1257 from adamhathcock/copilot/fix-rewind-buffer-size-zstandard 2026-03-17 18:38:56 +00:00
copilot-swe-agent[bot]
d56b676ee9 fix: increase RewindableBufferSize to 160KB to cover ZStandard worst-case first block
Co-authored-by: adamhathcock <527620+adamhathcock@users.noreply.github.com>
2026-03-17 12:25:29 +00:00
Daniel Sabel
5fc0d691cf fixes xor range on async WinzipAesCryptoStream path 2026-03-11 08:57:47 +01:00
Daniel Sabel
51859f9a2b fixes decompression of large mixed encrypted zip files 2026-03-09 14:02:31 +01:00
Adam Hathcock
b05a16d007 oops, wrong change made 2026-03-06 15:39:07 +00:00
Adam Hathcock
e6a179bdb5 fmt 2026-03-06 15:33:57 +00:00
Adam Hathcock
f13ab3a0e7 FindFactoryAsync shouldn't be public 2026-03-06 15:33:30 +00:00
Adam Hathcock
ebd784cfb2 code review changes 2026-03-06 15:16:28 +00:00