{"record":{"id":"a27fdb7592501323","repo":"astrid-runtime/astrid","slug":"fuse-lease-paths-must-be-absolute","errorCode":null,"errorMessage":"FUSE lease paths must be absolute","messagePattern":"FUSE lease paths must be absolute","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-provider-fuse/src/service.rs","lineNumber":219,"sourceCode":"    Ok(())\n}\n\nfn validate_lease(lease: &StorageMountLeaseV1) -> Result<()> {\n    if lease.lease_token.len() < 16\n        || lease.lease_token.len() > 4096\n        || lease.lease_token.chars().any(char::is_control)\n    {\n        bail!(\"invalid FUSE callback token\");\n    }\n    let now = SystemTime::now()\n        .duration_since(UNIX_EPOCH)\n        .context(\"read system clock\")?\n        .as_secs();\n    if lease.expires_at_epoch_secs < now {\n        bail!(\"FUSE lease is expired\");\n    }\n    if !lease.resource_path.is_absolute() || !lease.callback_path.is_absolute() {\n        bail!(\"FUSE lease paths must be absolute\");\n    }\n    if lease.callback_path != lease.resource_path.join(\"control.sock\") {\n        bail!(\"FUSE callback path is not the kernel lease endpoint\");\n    }\n    platform_fs::validate_private_directory(&lease.resource_path)\n        .context(\"validate private FUSE lease resource\")?;\n    platform_fs::verify_no_redirects(&lease.resource_path)\n        .context(\"reject redirected FUSE lease resource\")?;\n    let manifest_path = lease.resource_path.join(\"lease.json\");\n    platform_fs::validate_private_file(&manifest_path)\n        .context(\"validate private FUSE lease manifest\")?;\n    let manifest = std::fs::read(&manifest_path).context(\"read FUSE lease manifest\")?;\n    if manifest.len() > 64 * 1024 {\n        bail!(\"FUSE lease manifest exceeds the bounded size\");\n    }\n    let admitted: StorageMountLeaseV1 =\n        serde_json::from_slice(&manifest).context(\"decode FUSE lease manifest\")?;\n    if admitted != *lease {","sourceCodeStart":201,"sourceCodeEnd":237,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-provider-fuse/src/service.rs#L201-L237","documentation":"The lease's `resource_path` (where lease artifacts live) and `callback_path` (the control socket) must both be absolute paths. Relative paths cannot be safely shared between the parent and helper processes (different working directories) and are rejected at validation.","triggerScenarios":"`validate_lease` finds `!lease.resource_path.is_absolute() || !lease.callback_path.is_absolute()` during `validate_launch`.","commonSituations":"Caller built paths from a relative CWD (e.g. \"runtime/fuse/mount\"); paths came from config with `~` unexpanded; a template placeholder left unsubstituted; the parent process ran with a different working directory than intended.","solutions":["Canonicalize paths with `std::fs::canonicalize` or join them onto an absolute base (e.g. `/run/...` or `std::env::temp_dir()`) before writing the lease.","Expand `~` and env vars when loading mount configuration.","Pass absolute paths from the parent process into the lease instead of CWD-relative values.","Assert path absoluteness at lease-creation time to fail early."],"exampleFix":"// before\nresource_path: PathBuf::from(\"runtime/fuse/mount\"),\n// after\nlet base = std::env::temp_dir().join(\"astrid-fuse\");\nresource_path: base.canonicalize().unwrap_or(base), // absolute","handlingStrategy":"validation","validationCode":"fn paths_are_absolute(lease: &StorageMountLeaseV1) -> bool {\n    lease.resource_path.is_absolute() && lease.callback_path.is_absolute()\n}\nif !paths_are_absolute(&lease) { return Err(\"lease paths must be absolute\"); }","typeGuard":"fn has_absolute_paths(lease: &StorageMountLeaseV1) -> bool {\n    lease.resource_path.is_absolute() && lease.callback_path.is_absolute()\n}","tryCatchPattern":null,"preventionTips":["Build lease paths from an absolute base (e.g. /run or temp_dir) at creation","Canonicalize paths before writing lease.json","Expand ~ and env vars when loading mount config","Validate path absoluteness when the lease is issued"],"tags":["fuse","paths","validation"],"backgroundTag":"invalid-argument-format","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}