Skip to content

Add coverage for legacy AUTHREQD parser edge cases#27

Merged
oferchen merged 1 commit into
masterfrom
codex/implement-pure-rust-rsync-with-full-parity
Oct 15, 2025
Merged

Add coverage for legacy AUTHREQD parser edge cases#27
oferchen merged 1 commit into
masterfrom
codex/implement-pure-rust-rsync-with-full-parity

Conversation

@oferchen
Copy link
Copy Markdown
Owner

Summary

  • add regression tests that ensure AUTHREQD lines with only whitespace are treated as lacking a module
  • verify the legacy parser rejects messages that omit the @rsyncd: prefix

Testing

  • cargo test

https://chatgpt.com/codex/tasks/task_e_68ef9a79d4048323a7c6dfe69254efb4

@oferchen oferchen merged commit f7f91b7 into master Oct 15, 2025
@oferchen oferchen deleted the codex/implement-pure-rust-rsync-with-full-parity branch October 15, 2025 13:02
oferchen added a commit that referenced this pull request May 22, 2026
#4716)

Adds four new SEC-1 helpers in `fast_io::dir_sandbox::at_syscalls`:

- `openat(dirfd, name, flags, mode) -> File` raw libc wrapper.
- `openat_via_sandbox_or_fallback(...)` adaptor that takes the sandbox
  fast path on a single-component leaf beneath `dest_dir` and falls back
  to `std::fs::OpenOptions` against `link_path` with best-effort `O_*`
  bit translation otherwise.
- `readlinkat(dirfd, name) -> PathBuf` raw libc wrapper with a growing
  buffer (256B -> PATH_MAX, doubling each round trip).
- `readlinkat_via_sandbox_or_fallback(...)` adaptor mirroring the
  openat shape but falling back to `std::fs::read_link`.

The helpers follow the established SEC-1 pattern: pinning the parent
via the sandbox dirfd closes the TOCTOU window between path walk and
the kernel reaching the inode. The `*_via_sandbox_or_fallback` adaptors
keep behaviour byte-identical for callers that have not yet plumbed a
`DirSandbox`, so individual call sites can be cut over one at a time.

This PR adds the helpers and re-exports them through
`dir_sandbox::mod` and `fast_io::lib`. It deliberately does NOT wire
any caller; per-site wiring lands in follow-up PRs so each cutover gets
its own diff and review.

Extends the existing tests module with 10 new tests covering:
- raw `openat` success and ENOENT,
- `openat_via_sandbox_or_fallback` fast path, multi-component
  fallback, and absent-sandbox fallback,
- raw `readlinkat` success and EINVAL on a non-symlink,
- `readlinkat_via_sandbox_or_fallback` fast path, EINVAL, and
  multi-component fallback.

All helpers are `#[cfg(unix)]` (the `dir_sandbox` module is itself
Unix-only); Windows continues to use path-based stdlib opens per the
SEC-1.l NTFS handle audit.

Closes (post-wire) 16+ GAPs from the SEC-1 path-syscall coverage audit
in PR #4710: #4 (readlinkat) plus the 9 direct openat sites (#9-#17)
and lays foundations for #5, #20 (open + readdir-loop) and #6, #27
(recursive *at peel).

Refs PR #4710.
oferchen added a commit that referenced this pull request May 22, 2026
…C-1.q (#4724)

Opens SEC-1.s to track the recursive_unlinkat_via_sandbox_or_fallback
helper called out by SEC-1.q (PR #4711) as the prerequisite for
DeleteFs::remove_dir_all_at and by PR #4710's GAP row #27 as the
missing Carrier piece for the --delete recursive fallback.

Documents the proposed signature mirroring the existing
*_via_sandbox_or_fallback family, the openat/fdopendir/readdir +
fstatat-classify + unlinkat peel algorithm, cycle detection via
(dev, ino) tracking, TOCTOU race handling for file-vs-dir swaps,
fallback to std::fs::remove_dir_all when the sandbox is absent,
upstream-equivalent error semantics from delete.c:48-176, the
cross-platform plan, an 8-case test plan, an ~480 LoC effort
estimate, and a three-step dispatch sequence keeping each PR
self-contained.

Docs-only: no implementation in this PR.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant