From 8cbbaf23e889270867420431f0ab6c0ffa722335 Mon Sep 17 00:00:00 2001
From: Eelco Dolstra <edolstra@gmail.com>
Date: Mon, 24 Jan 2022 23:02:28 +0100
Subject: [PATCH] Allow builtins.{readFile,path} on invalid paths

Stop-gap measure to fix #5975.
---
 src/libexpr/primops.cc | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 074181e13..9d36f72a8 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1445,9 +1445,13 @@ static void prim_readFile(EvalState & state, const Pos & pos, Value * * args, Va
     string s = readFile(path);
     if (s.find((char) 0) != string::npos)
         throw Error("the contents of the file '%1%' cannot be represented as a Nix string", path);
-    auto refs = state.store->isInStore(path) ?
-        state.store->queryPathInfo(state.store->toStorePath(path).first)->references :
-        StorePathSet{};
+    StorePathSet refs;
+    if (state.store->isInStore(path)) {
+        try {
+            refs = state.store->queryPathInfo(state.store->toStorePath(path).first)->references;
+        } catch (Error &) { // FIXME: should be InvalidPathError
+        }
+    }
     auto context = state.store->printStorePathSet(refs);
     v.mkString(s, context);
 }
@@ -1866,10 +1870,13 @@ static void addPath(
         StorePathSet refs;
 
         if (state.store->isInStore(path)) {
-            auto [storePath, subPath] = state.store->toStorePath(path);
-            // FIXME: we should scanForReferences on the path before adding it
-            refs = state.store->queryPathInfo(storePath)->references;
-            path = state.store->toRealPath(storePath) + subPath;
+            try {
+                auto [storePath, subPath] = state.store->toStorePath(path);
+                // FIXME: we should scanForReferences on the path before adding it
+                refs = state.store->queryPathInfo(storePath)->references;
+                path = state.store->toRealPath(storePath) + subPath;
+            } catch (Error &) { // FIXME: should be InvalidPathError
+            }
         }
 
         path = evalSettings.pureEval && expectedHash