3.9.1
·
5 commits
to master
since this release
3.9.1 (2026-10-05)
PBP extraction — PBPSharp 1.1.4
- PBPs whose compressed blocks were written without a final deflate block now extract. Some authoring tools flush each PSAR block with
Z_SYNC_FLUSHinstead of finishing the stream, so the last deflate block never sets BFINAL. SharpZipLib's stream wrapper reported that as "Unexpected EOF" and the whole file failed withDecompressionError; the raw inflater is now driven directly and accepts a complete 16-sector block, while a block cut short still fails. Verified byte-identical against real Brave Fencer Musashi and Ridge Racer PBPs across compression levels (stored, default and maximum). - A block cut short can no longer be accepted as a short block. The decompressed output is bounded to exactly one 16-sector block, so a stream that ends before a full block, or expands past one, is rejected with
DecompressionErrorinstead of silently shifting every later block in the extracted image.
Fewer false bug reports
- The by-design duplicate-product notice is no longer reported.
<name>.chd was already produced earlier in this batch; keeping the first one.appears when two inputs resolve to the same CHD (typically an archive whose contents were not known at the collision preflight); the first product is kept, as intended. - CHDSharp device and permission errors are classified as environment conditions. A drive that was unplugged, a failing disk, a full destination or denied access now logs
CHDSharp could not read or write the image: ...and is excluded from bug reports; only genuine encoder defects still report.
Housekeeping
- Roslynator.Analyzers bumped 5.0.0 → 5.0.1.
- Test suite grew to 1121 tests (1093 unit + 28 integration), including regression coverage for unfinished deflate streams, truncated PBP blocks and a zero-length stored index entry.
- PBPSharp published as 1.1.4; the README, library reference, bug-reporting guide and troubleshooting guide document the new block handling and exclusions.