aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorregnat <rg@regnat.ovh>2021-06-21 15:17:31 +0200
committerregnat <rg@regnat.ovh>2021-06-21 15:29:15 +0200
commit3784c66a46aea2cc3e26b8cff94b3a1f477888f1 (patch)
treeb0bada8ea475ed7758f440ebdc7f401932add39b
parentdb3de0727ec8416e1542f0158d0247a2cbe6e268 (diff)
Remove a possible existing store path when building CA derivations
In case a previous interrupted build left a garbage path laying around, remove it before trying to move the path to its final location. Fix #4858
-rw-r--r--src/libstore/build/local-derivation-goal.cc1
-rwxr-xr-xtests/ca/build-with-garbage-path.sh20
-rw-r--r--tests/local.mk1
3 files changed, 22 insertions, 0 deletions
diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc
index 73e2350ea..279139020 100644
--- a/src/libstore/build/local-derivation-goal.cc
+++ b/src/libstore/build/local-derivation-goal.cc
@@ -2487,6 +2487,7 @@ void LocalDerivationGoal::registerOutputs()
assert(newInfo.ca);
} else {
auto destPath = worker.store.toRealPath(finalDestPath);
+ deletePath(destPath);
movePath(actualPath, destPath);
actualPath = destPath;
}
diff --git a/tests/ca/build-with-garbage-path.sh b/tests/ca/build-with-garbage-path.sh
new file mode 100755
index 000000000..e6f878702
--- /dev/null
+++ b/tests/ca/build-with-garbage-path.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+# Regression test for https://github.com/NixOS/nix/issues/4858
+
+source common.sh
+sed -i 's/experimental-features .*/& ca-derivations ca-references/' "$NIX_CONF_DIR"/nix.conf
+
+# Get the output path of `rootCA`, and put some garbage instead
+outPath="$(nix-build ./content-addressed.nix -A rootCA --no-out-link)"
+nix-store --delete "$outPath"
+touch "$outPath"
+
+# The build should correctly remove the garbage and put the expected path instead
+nix-build ./content-addressed.nix -A rootCA --no-out-link
+
+# Rebuild it. This shouldn’t overwrite the existing path
+oldInode=$(stat -c '%i' "$outPath")
+nix-build ./content-addressed.nix -A rootCA --no-out-link --arg seed 2
+newInode=$(stat -c '%i' "$outPath")
+[[ "$oldInode" == "$newInode" ]]
diff --git a/tests/local.mk b/tests/local.mk
index 59eb4eb0f..663b8c8bc 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -45,6 +45,7 @@ nix_tests = \
build.sh \
compute-levels.sh \
ca/build.sh \
+ ca/build-with-garbage-path.sh \
ca/substitute.sh \
ca/signatures.sh \
ca/nix-run.sh \