Files
codex/codex-rs/utils/absolute-path/src/system_aliases_tests.rs
T
felixxia-oai 6f51c65958 Fix macOS system-alias matching in patch permission checks (#47879)
## Why

Local `apply_patch` permission checks can treat a macOS system alias and its canonical spelling as different locations, sending writes covered by temporary-directory grants for unnecessary approval.

## What changed

- Normalize trusted top-level aliases in local policy roots and patch targets, reusing a prepared matcher for permission requests and patch safety checks.
- Share alias normalization with Seatbelt and the macOS executor sandbox while preserving mutable symlinks and missing descendants.
- Preserve read-only and deny precedence, protected metadata restrictions, and remote URI matching. Propagate normalization failures from fallible permission checks.

## Testing

Add macOS regressions for multi-file patches with missing parent directories through both direct `apply_patch` calls and shell interception, asserting automatic approval and file contents. Add unit coverage for alias restriction precedence, mutable symlink preservation, missing descendants, and remote permission isolation.

GitOrigin-RevId: 0822ff951eaab728cb1ad91281745fa1b8809f15
2026-09-24 16:36:57 +00:00

30 lines
1.0 KiB
Rust

use crate::AbsolutePathBuf;
use pretty_assertions::assert_eq;
#[cfg(target_os = "macos")]
#[test]
fn system_aliases_preserve_mutable_symlinks_and_missing_descendants() -> std::io::Result<()> {
let directory = tempfile::tempdir_in("/tmp")?;
let outside = tempfile::tempdir()?;
let logical = AbsolutePathBuf::from_absolute_path(directory.path())?;
let physical = logical.canonicalize()?;
std::os::unix::fs::symlink(outside.path(), logical.join("mutable"))?;
for suffix in ["", "missing/child", "mutable", "mutable/missing/child"] {
assert_eq!(
logical.join(suffix).normalize_system_aliases()?,
physical.join(suffix),
);
}
Ok(())
}
#[test]
fn ordinary_paths_keep_missing_descendants() -> std::io::Result<()> {
let directory = tempfile::tempdir()?;
let physical = AbsolutePathBuf::from_absolute_path(directory.path())?.canonicalize()?;
let missing = physical.join("missing/child");
assert_eq!(missing.normalize_system_aliases()?, missing);
Ok(())
}