fix(io/local): resolve symlinks on sandbox root #10

Merged
Snider merged 1 commit from fix/macos-sandbox-symlink into dev 2026-02-19 14:22:28 +00:00
2 changed files with 10 additions and 1 deletions

View file

@ -21,6 +21,13 @@ func New(root string) (*Medium, error) {
if err != nil {
return nil, err
}
// Resolve symlinks so sandbox checks compare like-for-like.
// On macOS, /var is a symlink to /private/var — without this,
// EvalSymlinks on child paths resolves to /private/var/... while
// root stays /var/..., causing false sandbox escape detections.
if resolved, err := filepath.EvalSymlinks(abs); err == nil {
abs = resolved
}
return &Medium{root: abs}, nil
}

View file

@ -12,7 +12,9 @@ func TestNew(t *testing.T) {
root := t.TempDir()
m, err := New(root)
assert.NoError(t, err)
assert.Equal(t, root, m.root)
// New() resolves symlinks (macOS /var → /private/var), so compare resolved paths.
resolved, _ := filepath.EvalSymlinks(root)
assert.Equal(t, resolved, m.root)
}
func TestPath(t *testing.T) {