Skip to content

ChunkerFixed: do not take a short read for EOF (1.2-maint) - #10564

Merged
ThomasWaldmann merged 2 commits into
borgbackup:1.2-maintfrom
ThomasWaldmann:fixed-chunker-short-read-12
Oct 29, 2026
Merged

ThomasWaldmann merged 2 commits into
borgbackup:1.2-maintfrom
ThomasWaldmann:fixed-chunker-short-read-12

Conversation

@ThomasWaldmann

@ThomasWaldmann ThomasWaldmann commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

Port of #10563 to 1.2-maint.

ChunkerFixed.chunkify() took any short read (got < wanted) for EOF and stopped. Reads from a pipe or FIFO often return less than requested, so borg create --read-special --chunker-params fixed,... could silently archive only a truncated part of a FIFO's content. On macOS, 3 MiB written into a pipe came out as only 64 KiB of chunks.

After a short read, the chunker now keeps reading until the block is full or a read returns no data (real EOF). Filling the block also keeps the chunk boundaries at fixed offsets, so dedup is not affected.

Tests: the new test_chunkify_short_reads uses a file object that returns at most 100 bytes per read, with and without a header block.

Note: the posix_fadvise() / ESPIPE fix for the same scenario is not part of this PR (it was pushed after the merge), see #10570.

🤖 Generated with Claude Code

ThomasWaldmann and others added 2 commits October 29, 2026 19:48
chunkify() stopped reading the whole input as soon as a read returned less
than the requested block size. A short read is not EOF though, e.g. when
reading from a pipe: "borg create --read-special" with the fixed chunker
archived only the first 64 KiB of a FIFO's content (seen on macOS) and
silently dropped the rest.

Now keep reading until the block is complete or a read returns nothing.
Filling the block also keeps the chunk boundaries at fixed offsets.

Port of borgbackup#10563 from 1.4-maint. master is not affected any more, see borgbackup#10166.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Same behaviour and same read calls, just one loop instead of a first
read followed by a loop for the rest of the block.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant