Fix empty std::optional dereference in writeDerivation()
https://hydra.nixos.org/build/123017579
This commit is contained in:
parent
3c50e84387
commit
de2641ae99
|
@ -404,7 +404,7 @@ static DerivationOutput readDerivationOutput(Source & in, const Store & store)
|
||||||
{
|
{
|
||||||
auto path = store.parseStorePath(readString(in));
|
auto path = store.parseStorePath(readString(in));
|
||||||
auto hashAlgo = readString(in);
|
auto hashAlgo = readString(in);
|
||||||
const auto hash = readString(in);
|
auto hash = readString(in);
|
||||||
|
|
||||||
std::optional<FixedOutputHash> fsh;
|
std::optional<FixedOutputHash> fsh;
|
||||||
if (hashAlgo != "") {
|
if (hashAlgo != "") {
|
||||||
|
@ -413,7 +413,7 @@ static DerivationOutput readDerivationOutput(Source & in, const Store & store)
|
||||||
method = FileIngestionMethod::Recursive;
|
method = FileIngestionMethod::Recursive;
|
||||||
hashAlgo = string(hashAlgo, 2);
|
hashAlgo = string(hashAlgo, 2);
|
||||||
}
|
}
|
||||||
const HashType hashType = parseHashType(hashAlgo);
|
auto hashType = parseHashType(hashAlgo);
|
||||||
fsh = FixedOutputHash {
|
fsh = FixedOutputHash {
|
||||||
.method = std::move(method),
|
.method = std::move(method),
|
||||||
.hash = Hash(hash, hashType),
|
.hash = Hash(hash, hashType),
|
||||||
|
@ -463,11 +463,16 @@ Source & readDerivation(Source & in, const Store & store, BasicDerivation & drv)
|
||||||
void writeDerivation(Sink & out, const Store & store, const BasicDerivation & drv)
|
void writeDerivation(Sink & out, const Store & store, const BasicDerivation & drv)
|
||||||
{
|
{
|
||||||
out << drv.outputs.size();
|
out << drv.outputs.size();
|
||||||
for (auto & i : drv.outputs)
|
for (auto & i : drv.outputs) {
|
||||||
out << i.first
|
out << i.first
|
||||||
<< store.printStorePath(i.second.path)
|
<< store.printStorePath(i.second.path);
|
||||||
<< i.second.hash->printMethodAlgo()
|
if (i.second.hash) {
|
||||||
<< i.second.hash->hash.to_string(Base16, false);
|
out << i.second.hash->printMethodAlgo()
|
||||||
|
<< i.second.hash->hash.to_string(Base16, false);
|
||||||
|
} else {
|
||||||
|
out << "" << "";
|
||||||
|
}
|
||||||
|
}
|
||||||
writeStorePaths(store, out, drv.inputSrcs);
|
writeStorePaths(store, out, drv.inputSrcs);
|
||||||
out << drv.platform << drv.builder << drv.args;
|
out << drv.platform << drv.builder << drv.args;
|
||||||
out << drv.env.size();
|
out << drv.env.size();
|
||||||
|
|
|
@ -19,7 +19,7 @@ namespace nix {
|
||||||
|
|
||||||
void Hash::init()
|
void Hash::init()
|
||||||
{
|
{
|
||||||
if (!type) abort();
|
assert(type);
|
||||||
switch (*type) {
|
switch (*type) {
|
||||||
case htMD5: hashSize = md5HashSize; break;
|
case htMD5: hashSize = md5HashSize; break;
|
||||||
case htSHA1: hashSize = sha1HashSize; break;
|
case htSHA1: hashSize = sha1HashSize; break;
|
||||||
|
@ -101,15 +101,15 @@ static string printHash32(const Hash & hash)
|
||||||
|
|
||||||
string printHash16or32(const Hash & hash)
|
string printHash16or32(const Hash & hash)
|
||||||
{
|
{
|
||||||
|
assert(hash.type);
|
||||||
return hash.to_string(hash.type == htMD5 ? Base16 : Base32, false);
|
return hash.to_string(hash.type == htMD5 ? Base16 : Base32, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
HashType assertInitHashType(const Hash & h) {
|
HashType assertInitHashType(const Hash & h)
|
||||||
if (h.type)
|
{
|
||||||
return *h.type;
|
assert(h.type);
|
||||||
else
|
return *h.type;
|
||||||
abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Hash::to_string(Base base, bool includeType) const
|
std::string Hash::to_string(Base base, bool includeType) const
|
||||||
|
@ -363,14 +363,15 @@ HashType parseHashType(const string & s)
|
||||||
string printHashType(HashType ht)
|
string printHashType(HashType ht)
|
||||||
{
|
{
|
||||||
switch (ht) {
|
switch (ht) {
|
||||||
case htMD5: return "md5"; break;
|
case htMD5: return "md5";
|
||||||
case htSHA1: return "sha1"; break;
|
case htSHA1: return "sha1";
|
||||||
case htSHA256: return "sha256"; break;
|
case htSHA256: return "sha256";
|
||||||
case htSHA512: return "sha512"; break;
|
case htSHA512: return "sha512";
|
||||||
|
default:
|
||||||
|
// illegal hash type enum value internally, as opposed to external input
|
||||||
|
// which should be validated with nice error message.
|
||||||
|
abort();
|
||||||
}
|
}
|
||||||
// illegal hash type enum value internally, as opposed to external input
|
|
||||||
// which should be validated with nice error message.
|
|
||||||
abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ namespace nix {
|
||||||
MakeError(BadHash, Error);
|
MakeError(BadHash, Error);
|
||||||
|
|
||||||
|
|
||||||
enum HashType : char { htMD5, htSHA1, htSHA256, htSHA512 };
|
enum HashType : char { htMD5 = 42, htSHA1, htSHA256, htSHA512 };
|
||||||
|
|
||||||
|
|
||||||
const int md5HashSize = 16;
|
const int md5HashSize = 16;
|
||||||
|
|
Loading…
Reference in a new issue