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.
This commit is contained in:
Simon Rainerson 2023-01-31 11:36:13 +01:00 committed by Théophane Hufschmitt
parent 9113b4252b
commit 31a6e10fe5

View file

@ -1196,6 +1196,15 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
if (checkSigs && pathInfoIsUntrusted(info)) if (checkSigs && pathInfoIsUntrusted(info))
throw Error("cannot add path '%s' because it lacks a signature by a trusted key", printStorePath(info.path)); 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); addTempRoot(info.path);
if (repair || !isValidPath(info.path)) { if (repair || !isValidPath(info.path)) {
@ -1220,6 +1229,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source,
TeeSource wrapperSource { source, hashSink }; TeeSource wrapperSource { source, hashSink };
narRead = true;
restorePath(realPath, wrapperSource); restorePath(realPath, wrapperSource);
auto hashResult = hashSink.finish(); auto hashResult = hashSink.finish();