nix-store: fix out of sync protocol

If a NAR is already in the store, addToStore doesn't read the source
which makes the protocol go out of sync. This happens for example when
two client try to nix-copy-closure the same derivation at the same time.
This commit is contained in:
Jonas Chevalier 2019-08-12 17:19:43 +02:00
parent 91b00b145f
commit b226b5cd97
No known key found for this signature in database
GPG key ID: 71BAF6D40C1D63D7

View file

@ -950,8 +950,16 @@ static void opServe(Strings opFlags, Strings opArgs)
info.sigs = readStrings<StringSet>(in); info.sigs = readStrings<StringSet>(in);
in >> info.ca; in >> info.ca;
// FIXME: race if addToStore doesn't read source? if (info.narSize == 0) {
store->addToStore(info, in, NoRepair, NoCheckSigs); throw Error("narInfo is too old and missing the narSize field");
}
SizedSource sizedSource(in, info.narSize);
store->addToStore(info, sizedSource, NoRepair, NoCheckSigs);
// consume all the data that has been sent before continuing.
sizedSource.drainAll();
out << 1; // indicate success out << 1; // indicate success