From 612d553a4fa30ccd8629ec1b8de58e5445940a57 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Fri, 15 Aug 2025 18:05:06 +0200 Subject: [PATCH] libstore: fail makeLazyNarAccessor for broken .ls files Change-Id: I58ecc89046ee5fc58d05c980acb3616e91ee4741 --- lix/libstore/nar-accessor.cc | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lix/libstore/nar-accessor.cc b/lix/libstore/nar-accessor.cc index 2d45aaaf0..b6db22a95 100644 --- a/lix/libstore/nar-accessor.cc +++ b/lix/libstore/nar-accessor.cc @@ -31,23 +31,30 @@ struct NarAccessor : public FSAccessor { using namespace nar_index; - std::function recurse; + std::function recurse; - recurse = [&](Entry & member, JSON & v) { - std::string type = v["type"]; + recurse = [&](Entry & member, const JSON & v) { + std::string type = valueAt(v, "type"); if (type == "directory") { + auto & entries = ensureType(valueAt(v, "entries"), JSON::value_t::object); Directory dir; - for (auto i = v["entries"].begin(); i != v["entries"].end(); ++i) { + for (auto i = entries.begin(); i != entries.end(); ++i) { std::string name = i.key(); recurse(dir.contents[name], i.value()); } member = std::move(dir); } else if (type == "regular") { - member = File{v.value("executable", false), v["narOffset"], v["size"]}; + member = File{ + ensureType(v.value("executable", false), JSON::value_t::boolean), + ensureType(valueAt(v, "narOffset"), JSON::value_t::number_unsigned), + ensureType(valueAt(v, "size"), JSON::value_t::number_unsigned), + }; } else if (type == "symlink") { - member = Symlink{v.value("target", "")}; - } else return; + member = Symlink{ensureType(v.value("target", ""), JSON::value_t::string)}; + } else { + return; + } }; JSON v = json::parse(listing, "a nar content listing");