{"record":{"id":"7b3a2a3acd20d797","repo":"astrid-runtime/astrid","slug":"fskit-service-mountpoint-overlaps-the-lease-resour","errorCode":null,"errorMessage":"FSKit service mountpoint overlaps the lease resource","messagePattern":"FSKit service mountpoint overlaps the lease resource","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-provider-fskit/src/service.rs","lineNumber":134,"sourceCode":"        .context(\"read FSKit service launch\")?;\n    if bytes.len() as u64 > MAX_LAUNCH_BYTES {\n        bail!(\"FSKit service launch exceeds limit\");\n    }\n    serde_json::from_slice(&bytes).context(\"decode FSKit service launch\")\n}\n\nfn validate_launch(launch: &StorageProviderServiceLaunchV1) -> Result<()> {\n    if launch.schema != STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1 {\n        bail!(\"unsupported FSKit service launch schema {}\", launch.schema);\n    }\n    validate_launch_parent(&launch.parent)?;\n    validate_lease(&launch.lease)?;\n    crate::validate_mountpoint_layout(&launch.mountpoint)?;\n    if launch.mountpoint == launch.lease.resource_path\n        || launch.mountpoint.starts_with(&launch.lease.resource_path)\n        || launch.lease.resource_path.starts_with(&launch.mountpoint)\n    {\n        bail!(\"FSKit service mountpoint overlaps the lease resource\");\n    }\n    crate::validate_mountpoint_ancestors(&launch.mountpoint)?;\n    crate::validate_unmounted_mountpoint(&launch.mountpoint)?;\n    validate_control_path(&launch.control_path, &launch.lease.resource_path)?;\n    Ok(())\n}\n\nfn validate_lease(lease: &astrid_core::storage_filesystem::StorageMountLeaseV1) -> Result<()> {\n    if lease.lease_token.len() < 16 || lease.lease_token.len() > 4096 {\n        bail!(\"FSKit lease callback token is invalid\");\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!(\"FSKit lease is expired\");\n    }","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-provider-fskit/src/service.rs#L116-L152","documentation":"During FSKit service launch validation, the provider rejects a launch whose mountpoint path overlaps (equals, nests under, or contains) the lease resource_path. The lease resource directory is a private kernel-managed area; mounting a filesystem on top of it (or vice versa) would shadow or corrupt the lease data. This is a deliberate safety check in validate_launch.","triggerScenarios":"Calling run/validate_launch with a StorageMountLaunchV1 where launch.mountpoint == lease.resource_path, launch.mountpoint is a subpath of lease.resource_path, or lease.resource_path is a subpath of launch.mountpoint.","commonSituations":"Config generators that reuse the same directory for both the lease resource and the mount target; templated configs that substitute the lease path into the mountpoint field; scripts that assume mountpoint can default to resource_path.","solutions":["Choose a mountpoint that is a disjoint path from the lease resource_path (no prefix relationship in either direction)","Regenerate the launch config so mountpoint lives outside the lease resource directory","If the intent is to mount the leased filesystem itself, use the provider's managed mount flow instead of supplying an overlapping mountpoint manually"],"exampleFix":"// before\nlaunch.mountpoint = PathBuf::from(\"/var/fskit/leases/abc/resource\");\n// after\nlaunch.mountpoint = PathBuf::from(\"/mnt/fskit/abc\");","handlingStrategy":"validation","validationCode":"fn mountpoint_ok(launch: &StorageMountLaunchV1) -> bool {\n    let r = &launch.lease.resource_path;\n    launch.mountpoint != *r\n        && !launch.mountpoint.starts_with(r)\n        && !r.starts_with(&launch.mountpoint)\n}","typeGuard":"fn is_disjoint(child: &Path, parent: &Path) -> bool {\n    !(child.starts_with(parent) || parent.starts_with(child))\n}","tryCatchPattern":null,"preventionTips":["Keep mountpoints under a dedicated mount root (e.g. /mnt) separate from the lease resource directory","Validate disjointness in config generation, before calling the provider","Never default mountpoint to the lease resource_path"],"tags":["filesystem","validation","fskit","path-overlap"],"backgroundTag":"invalid-config-value","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}