{"record":{"id":"87ef55f627eea24c","repo":"astrid-runtime/astrid","slug":"mountpoint-must-be-absolute-87ef55","errorCode":null,"errorMessage":"mountpoint must be absolute","messagePattern":"mountpoint must be absolute","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-provider-fuse/src/mountpoint.rs","lineNumber":28,"sourceCode":"\n/// Prepare a canonical, private, empty, non-redirected Linux mountpoint.\npub(crate) fn prepare_mountpoint(\n    requested: Option<PathBuf>,\n    view: &StorageProviderViewV1,\n) -> Result<(PathBuf, bool)> {\n    let requested = requested.unwrap_or_else(|| {\n        let leaf = match view {\n            StorageProviderViewV1::Principal(principal) => principal.to_string(),\n            StorageProviderViewV1::Fleet(fleet) => fleet.to_string(),\n            StorageProviderViewV1::Admin => \"system\".to_owned(),\n        };\n        std::env::var_os(\"HOME\")\n            .map_or_else(|| PathBuf::from(\"/tmp\"), PathBuf::from)\n            .join(\"Astrid\")\n            .join(leaf)\n    });\n    if !requested.is_absolute() {\n        bail!(\"mountpoint must be absolute\");\n    }\n    let existed = requested.symlink_metadata().is_ok();\n    if !existed {\n        std::fs::create_dir_all(&requested)\n            .with_context(|| format!(\"create mountpoint {}\", requested.display()))?;\n    }\n    astrid_core::platform_fs::verify_no_redirects(&requested)\n        .with_context(|| format!(\"reject redirected mountpoint {}\", requested.display()))?;\n    let metadata = std::fs::symlink_metadata(&requested)?;\n    if !metadata.is_dir() {\n        bail!(\"mountpoint is not a directory: {}\", requested.display());\n    }\n    let expected_uid = u32::from(getuid());\n    if metadata.uid() != expected_uid {\n        bail!(\n            \"mountpoint must be owned by the current OS user: {}\",\n            requested.display()\n        );","sourceCodeStart":10,"sourceCodeEnd":46,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-provider-fuse/src/mountpoint.rs#L10-L46","documentation":"prepare_mountpoint validates that the requested mountpoint path is absolute before creating anything. A relative path is rejected with \"mountpoint must be absolute\" (crates/astrid-storage-provider-fuse/src/mountpoint.rs:28).","triggerScenarios":"Calling prepare_mountpoint (directly or via the mount flow) with a relative path such as \"mnt/vol\" or \"./vol\" instead of an absolute path like \"/home/user/Astrid/vol\".","commonSituations":"Passing a CLI argument or config value as a relative path; relying on the process's current working directory; scripts invoked from unexpected directories.","solutions":["Convert the path to absolute before mounting (std::fs::canonicalize or join with a base directory)","Pass a fully-qualified path on the command line or in config","Check the path with Path::is_absolute() before calling the mount API"],"exampleFix":"// before\nlet mp = PathBuf::from(\"mnt/vol\");\nprepare_mountpoint(mp)?; // bails: mountpoint must be absolute\n// after\nlet mp = std::fs::canonicalize(\"mnt/vol\")?; // or PathBuf::from(\"/home/user/mnt/vol\")\nprepare_mountpoint(mp)?;","handlingStrategy":"validation","validationCode":"fn ensure_absolute(p: &std::path::Path) -> std::io::Result<std::path::PathBuf> { if p.is_absolute() { Ok(p.to_path_buf()) } else { std::fs::canonicalize(p) } }","typeGuard":"fn is_absolute_path(p: &str) -> bool { std::path::Path::new(p).is_absolute() }","tryCatchPattern":"match prepare_mountpoint(&mp) { Err(e) if e.to_string() == \"mountpoint must be absolute\" => prepare_mountpoint(&std::fs::canonicalize(&mp)?)?, r => r? }","preventionTips":["Always pass absolute paths in config and CLI","Resolve relative paths against a known base dir early","Unit-test path inputs for absoluteness"],"tags":["mountpoint","path-validation","argument"],"backgroundTag":"invalid-argument-value","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-17T20:17:13.540Z"}