diff --git a/docker/Dockerfile b/docker/Dockerfile index 2601b08..e3ffd2f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -32,9 +32,7 @@ RUN --mount=type=cache,target=/nix,from=nixos/nix:latest,source=/nix \ ln -s "$bin" /out/test-nix/bin/$(basename "$bin"); \ done && \ mkdir -p /out/test-rootfs/tmp \ - /out/test-rootfs/usr/local/bin \ - /out/test-rootfs/var/run \ - /out/test-rootfs/var/lib/intermesh && \ + /out/test-rootfs/usr/local/bin && \ chmod 1777 /out/test-rootfs/tmp FROM e2e-builder AS builder diff --git a/src/state/mod.rs b/src/state/mod.rs index d50656b..22dc335 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -137,7 +137,20 @@ impl State { /// If a field isn't provided via args/env, we fall back to the state file. pub(crate) async fn new(args: Args) -> Result { if let Some(parent) = args.state_file.parent() { - fs::create_dir_all(parent).await?; + fs::create_dir_all(parent).await.with_context(|| { + format!("failed to create state directory {}", parent.display()) + })?; + #[cfg(unix)] + { + fs::set_permissions(parent, Permissions::from_mode(0o700)) + .await + .with_context(|| { + format!( + "failed to set permissions on state directory {}", + parent.display() + ) + })?; + } } let mut private_key_pem = None; @@ -368,7 +381,9 @@ impl State { .context("state file has no parent directory")? .to_path_buf(); - fs::create_dir_all(&parent_dir).await?; + fs::create_dir_all(&parent_dir).await.with_context(|| { + format!("failed to create state directory {}", parent_dir.display()) + })?; // The tempfile + fsync + rename sequence uses blocking std::fs APIs. // Run it on Tokio's blocking pool so we don't stall async tasks.