Hmbown/CodeWhale · error · std::io::Error

external credential path contains reparse point {}

Error message

external credential path contains reparse point {}

What it means

Path-walk guard in reject_windows_reparse_components: while walking each path component, symlink_metadata reported FILE_ATTRIBUTE_REPARSE_POINT, meaning some component (directory or file) in the credential path is a symlink/junction/mount point. Credential paths must be plain directories to avoid link-based redirection.

Source

Thrown at crates/tui/src/external_credentials.rs:626

}

#[cfg(windows)]
fn reject_windows_reparse_components(path: &Path) -> io::Result<()> {
    use std::os::windows::fs::MetadataExt;
    use windows_sys::Win32::Storage::FileSystem::FILE_ATTRIBUTE_REPARSE_POINT;

    let mut current = std::path::PathBuf::new();
    for component in path.components() {
        current.push(component.as_os_str());
        if matches!(
            component,
            std::path::Component::Prefix(_) | std::path::Component::RootDir
        ) {
            continue;
        }
        let metadata = std::fs::symlink_metadata(&current)?;
        if metadata.file_attributes() & FILE_ATTRIBUTE_REPARSE_POINT != 0 {
            return Err(io::Error::new(
                io::ErrorKind::PermissionDenied,
                format!(
                    "external credential path contains reparse point {}",
                    codewhale_config::quote_os_path(&current)
                ),
            ));
        }
    }
    Ok(())
}

#[cfg(not(any(unix, windows)))]
fn open_secure_regular_file(_path: &Path, _require_owner_only: bool) -> io::Result<File> {
    Err(io::Error::new(
        io::ErrorKind::Unsupported,
        "secure external credential reads are unsupported on this platform",
    ))
}

View on GitHub (pinned to 0c42157ee5)

Solutions

  1. Remove or rename the symlink/junction component so the credential path is composed of real directories.
  2. Point configuration at the real (non-reparse) location of the credential directory.
  3. Avoid placing credential stores inside synced/virtualized folders that use reparse points.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/tui/src/external_credentials.rs:626 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of Hmbown/CodeWhale@0c42157ee5 (2026-08-20). Data as JSON: /api/errors/f4c5a8ea86dd2a1f. Report an issue: GitHub.