aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2023-08-25 17:18:37 +0200
committerRobert Hensing <robert@roberthensing.nl>2023-08-25 17:18:37 +0200
commit1e08e12d8138b09e6872cb498b723ade9ad71d68 (patch)
treea8409afe647d2165a66321d08bbe97d4c947cb74 /src/libexpr
parentd2e6cfa0750cb38ceef7dc0b8bb31cf3b0387e9c (diff)
pathExists: isDir when endswith /
Fixes https://github.com/NixOS/nix/issues/8838
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/primops.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 283f99a48..915b872c8 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -1520,15 +1520,25 @@ static RegisterPrimOp primop_storePath({
static void prim_pathExists(EvalState & state, const PosIdx pos, Value * * args, Value & v)
{
+ auto & arg = *args[0];
+
/* We don’t check the path right now, because we don’t want to
throw if the path isn’t allowed, but just return false (and we
can’t just catch the exception here because we still want to
- throw if something in the evaluation of `*args[0]` tries to
+ throw if something in the evaluation of `arg` tries to
access an unauthorized path). */
- auto path = realisePath(state, pos, *args[0], { .checkForPureEval = false });
+ auto path = realisePath(state, pos, arg, { .checkForPureEval = false });
+
+ /* SourcePath doesn't know about trailing slash. */
+ auto mustBeDir = arg.type() == nString && arg.str().ends_with("/");
try {
- v.mkBool(state.checkSourcePath(path).pathExists());
+ auto checked = state.checkSourcePath(path);
+ auto exists = checked.pathExists();
+ if (exists && mustBeDir) {
+ exists = checked.lstat().type == InputAccessor::tDirectory;
+ }
+ v.mkBool(exists);
} catch (SysError & e) {
/* Don't give away info from errors while canonicalising
‘path’ in restricted mode. */