Commit Graph
2 Commits
Author SHA1 Message Date
SAIREXandZen Dodd 92a2a09e3f rrsync: fix uploads to existing file destinations (#1136)
* rrsync: pin the parent of existing receiver file arguments

Passing an existing destination as the leaf's /proc/self/fd/N makes
rsync lstat the procfs link and try to replace it, failing with EPERM.
Use the held parent fd plus the leaf name, as for a missing destination.
Keep directory arguments pinned directly and verify the parent's leaf
still matches the already validated inode before releasing its fd.

Reuse pin_dir() for the parent checks and execute-only directory support.
Add end-to-end coverage for overwrite, creation, directories, pulls,
rejected paths, an in-place leaf replacement and a parent rename.

Based on the parent-pin approach described by JeanFrancoisGagne in #1107.

Fixes #1107.
Assisted-by: OpenAI Codex
Signed-off-by: Eduard Zateev <hackerowskiy@gmail.com>

* testsuite: expect rrsync file-argument skips

* testsuite: allow slow aligned overflow scans

---------

Signed-off-by: Eduard Zateev <hackerowskiy@gmail.com>
Co-authored-by: Zen Dodd <mail@steadytao.com>
2026-10-22 19:07:42 +10:00
Omar Elsayed 9dc0ff638c Bound aligned_i by s->count in hash_search() (--inplace) (#1133)
When updating_basis_file is active (--inplace), hash_search() advances
aligned_offset by s->blength and increments the 32-bit signed counter
aligned_i until aligned_offset catches up to offset.

If the source file is larger than 2 GiB and the peer supplies a small
s->blength and s->count, continuing to increment aligned_i past s->count
serves no purpose (as no basis blocks exist beyond s->count - 1) and can
overflow INT32_MAX into a negative index that bypasses the one-sided
aligned_i < s->count check.

Stop the catch-up loop once aligned_i reaches s->count so aligned_i
remains strictly within [0, s->count] and cannot overflow.

Reported-by: Mominul Islam Hemal <mominulislam-2021411216@cs.du.ac.bd>
2026-10-19 19:15:10 +10:00