aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/local-store.cc
diff options
context:
space:
mode:
authorSimon Rainerson <simon.rainerson@goodbyekansas.com>2023-01-31 11:36:13 +0100
committerThéophane Hufschmitt <theophane.hufschmitt@tweag.io>2023-08-07 10:27:40 +0200
commit31a6e10fe52fd4265501553ca479c51b510137e1 (patch)
treef104463003bc1f986083d661c5f4b0b26d7370c3 /src/libstore/local-store.cc
parent9113b4252b5cebebb929915dd0f3e230238be1ab (diff)
Fix misread of source if path is already valid
When receiving a stream of NARs through the ssh-ng protocol, an already existing path would cause the NAR archive to not be read in the stream, resulting in trying to parse the NAR as a ValidPathInfo. This results in the error message: error: not an absolute path: 'nix-archive-1' Fixes #6253 Usually this problem is avoided by running QueryValidPaths before AddMultipleToStore, but can arise when two parallel nix processes gets the same response from QueryValidPaths. This makes the problem more prominent when running builds in parallel.
Diffstat (limited to 'src/libstore/local-store.cc')
-rw-r--r--src/libstore/local-store.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 40a3bc194..17b4ecc73 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -1196,6 +1196,15 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
if (checkSigs && pathInfoIsUntrusted(info))
throw Error("cannot add path '%s' because it lacks a signature by a trusted key", printStorePath(info.path));
+ /* In case we are not interested in reading the NAR: discard it. */
+ bool narRead = false;
+ Finally cleanup = [&]() {
+ if (!narRead) {
+ ParseSink sink;
+ parseDump(sink, source);
+ }
+ };
+
addTempRoot(info.path);
if (repair || !isValidPath(info.path)) {
@@ -1220,6 +1229,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
TeeSource wrapperSource { source, hashSink };
+ narRead = true;
restorePath(realPath, wrapperSource);
auto hashResult = hashSink.finish();