aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorregnat <rg@regnat.ovh>2022-01-27 15:32:14 +0100
committerregnat <rg@regnat.ovh>2022-01-27 16:26:39 +0100
commitfcdc60ed227ba28f0d0d160d17df27fe179138b0 (patch)
tree1a2a634502c23fcb9f89282e41aaa2aaab489d00
parent1fe3bfdeaf7c57e9f7044a22edfbdf6fb9629e9d (diff)
Don’t require `NIX_PATH` entries to be valid paths
It’s totally valid to have entries in `NIX_PATH` that aren’t valid paths (they can even be arbitrary urls or `channel:<channel-name>`). Fix #5998 and #5980
-rw-r--r--src/libexpr/primops.cc20
-rw-r--r--tests/local.mk1
-rw-r--r--tests/nix_path.sh11
3 files changed, 26 insertions, 6 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 9d36f72a8..acee71d19 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -92,8 +92,6 @@ StringMap EvalState::realiseContext(const PathSet & context)
}
struct RealisePathFlags {
- // Whether to check whether the path is a valid absolute path
- bool requireAbsolutePath = true;
// Whether to check that the path is allowed in pure eval mode
bool checkForPureEval = true;
};
@@ -105,9 +103,7 @@ static Path realisePath(EvalState & state, const Pos & pos, Value & v, const Rea
auto path = [&]()
{
try {
- return flags.requireAbsolutePath
- ? state.coerceToPath(pos, v, context)
- : state.coerceToString(pos, v, context, false, false);
+ return state.coerceToPath(pos, v, context);
} catch (Error & e) {
e.addTrace(pos, "while realising the context of a path");
throw;
@@ -1489,7 +1485,19 @@ static void prim_findFile(EvalState & state, const Pos & pos, Value * * args, Va
pos
);
- auto path = realisePath(state, pos, *i->value, { .requireAbsolutePath = false });
+ PathSet context;
+ string path = state.coerceToString(pos, *i->value, context, false, false);
+
+ try {
+ auto rewrites = state.realiseContext(context);
+ path = rewriteStrings(path, rewrites);
+ } catch (InvalidPathError & e) {
+ throw EvalError({
+ .msg = hintfmt("cannot find '%1%', since path '%2%' is not valid", path, e.path),
+ .errPos = pos
+ });
+ }
+
searchPath.emplace_back(prefix, path);
}
diff --git a/tests/local.mk b/tests/local.mk
index 47d2862a4..2ec9baa12 100644
--- a/tests/local.mk
+++ b/tests/local.mk
@@ -63,6 +63,7 @@ nix_tests = \
eval-store.sh \
readfile-context.sh \
store-ping.sh \
+ nix_path.sh \
why-depends.sh
# parallel.sh
diff --git a/tests/nix_path.sh b/tests/nix_path.sh
new file mode 100644
index 000000000..d3657abf0
--- /dev/null
+++ b/tests/nix_path.sh
@@ -0,0 +1,11 @@
+# Regression for https://github.com/NixOS/nix/issues/5998 and https://github.com/NixOS/nix/issues/5980
+
+source common.sh
+
+export NIX_PATH=non-existent=/non-existent/but-unused-anyways:by-absolute-path=$PWD:by-relative-path=.
+
+nix-instantiate --eval -E '<by-absolute-path/simple.nix>' --restrict-eval
+nix-instantiate --eval -E '<by-relative-path/simple.nix>' --restrict-eval
+
+# Should ideally also test this, but there’s no pure way to do it, so just trust me that it works
+# nix-instantiate --eval -E '<nixpkgs>' -I nixpkgs=channel:nixos-unstable --restrict-eval