diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2020-11-19 20:30:41 +0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2020-11-19 20:31:30 +0100 |
commit | 0327580e5485143acb6eb7c8c515e3e179f1e3fe (patch) | |
tree | adc8cbc949f263daa9cddda5333c4e702d5096fe /src/libexpr | |
parent | bc4df3394db7115413c7cf6a94b44a3749b79ef7 (diff) |
Fix assertion failure in LockFile::LockFile()
Fixes #4241.
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/flake/lockfile.cc | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/libexpr/flake/lockfile.cc b/src/libexpr/flake/lockfile.cc index 8e2f7131f..6089d1363 100644 --- a/src/libexpr/flake/lockfile.cc +++ b/src/libexpr/flake/lockfile.cc @@ -78,7 +78,7 @@ LockFile::LockFile(const nlohmann::json & json, const Path & path) { if (jsonNode.find("inputs") == jsonNode.end()) return; for (auto & i : jsonNode["inputs"].items()) { - if (i.value().is_array()) { + if (i.value().is_array()) { // FIXME: remove, obsolete InputPath path; for (auto & j : i.value()) path.push_back(j); @@ -87,10 +87,13 @@ LockFile::LockFile(const nlohmann::json & json, const Path & path) std::string inputKey = i.value(); auto k = nodeMap.find(inputKey); if (k == nodeMap.end()) { - auto jsonNode2 = json["nodes"][inputKey]; - auto input = std::make_shared<LockedNode>(jsonNode2); + auto nodes = json["nodes"]; + auto jsonNode2 = nodes.find(inputKey); + if (jsonNode2 == nodes.end()) + throw Error("lock file references missing node '%s'", inputKey); + auto input = std::make_shared<LockedNode>(*jsonNode2); k = nodeMap.insert_or_assign(inputKey, input).first; - getInputs(*input, jsonNode2); + getInputs(*input, *jsonNode2); } if (auto child = std::dynamic_pointer_cast<LockedNode>(k->second)) node.inputs.insert_or_assign(i.key(), child); |