Skip to content

Commit

Permalink
Merge pull request NixOS#5346 from edolstra/allow-path
Browse files Browse the repository at this point in the history
Allow access to path copied to the store
  • Loading branch information
edolstra authored Oct 7, 2021
2 parents c9ee634 + 972405e commit 302c3a0
Show file tree
Hide file tree
Showing 7 changed files with 22 additions and 17 deletions.
13 changes: 10 additions & 3 deletions src/libexpr/eval.cc
Original file line number Diff line number Diff line change
Expand Up @@ -445,12 +445,12 @@ EvalState::EvalState(
StorePathSet closure;
store->computeFSClosure(store->toStorePath(r.second).first, closure);
for (auto & path : closure)
allowedPaths->insert(store->printStorePath(path));
allowPath(store->printStorePath(path));
} catch (InvalidPath &) {
allowedPaths->insert(r.second);
allowPath(r.second);
}
} else
allowedPaths->insert(r.second);
allowPath(r.second);
}
}

Expand Down Expand Up @@ -482,6 +482,12 @@ void EvalState::requireExperimentalFeatureOnEvaluation(
}
}

void EvalState::allowPath(const Path & path)
{
if (allowedPaths)
allowedPaths->insert(path);
}

Path EvalState::checkSourcePath(const Path & path_)
{
if (!allowedPaths) return path_;
Expand Down Expand Up @@ -1891,6 +1897,7 @@ string EvalState::copyPathToStore(PathSet & context, const Path & path)
dstPath = store->printStorePath(p);
srcToStore.insert_or_assign(path, std::move(p));
printMsg(lvlChatty, "copied source '%1%' -> '%2%'", path, dstPath);
allowPath(dstPath);
}

context.insert(dstPath);
Expand Down
5 changes: 5 additions & 0 deletions src/libexpr/eval.hh
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,11 @@ public:

SearchPath getSearchPath() { return searchPath; }

/* Allow access to a path. */
void allowPath(const Path & path);

/* Check whether access to a path is allowed and throw an error if
not. Otherwise return the canonicalised path. */
Path checkSourcePath(const Path & path);

void checkURI(const std::string & uri);
Expand Down
3 changes: 1 addition & 2 deletions src/libexpr/flake/flake.cc
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,7 @@ static std::tuple<fetchers::Tree, FlakeRef, FlakeRef> fetchOrSubstituteTree(
debug("got tree '%s' from '%s'",
state.store->printStorePath(tree.storePath), lockedRef);

if (state.allowedPaths)
state.allowedPaths->insert(tree.actualPath);
state.allowPath(tree.actualPath);

assert(!originalRef.input.getNarHash() || tree.storePath == originalRef.input.computeStorePath(*state.store));

Expand Down
3 changes: 1 addition & 2 deletions src/libexpr/primops.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1892,8 +1892,7 @@ static void addPath(EvalState & state, const Pos & pos, const string & name, con

mkString(v, dstPath, {dstPath});

if (state.allowedPaths)
state.allowedPaths->insert(v.string.s);
state.allowPath(v.string.s);
}


Expand Down
3 changes: 1 addition & 2 deletions src/libexpr/primops/fetchMercurial.cc
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,7 @@ static void prim_fetchMercurial(EvalState & state, const Pos & pos, Value * * ar
mkInt(*state.allocAttr(v, state.symbols.create("revCount")), *revCount);
v.attrs->sort();

if (state.allowedPaths)
state.allowedPaths->insert(tree.actualPath);
state.allowPath(tree.actualPath);
}

static RegisterPrimOp r_fetchMercurial("fetchMercurial", 1, prim_fetchMercurial);
Expand Down
6 changes: 2 additions & 4 deletions src/libexpr/primops/fetchTree.cc
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,7 @@ static void fetchTree(

auto [tree, input2] = input.fetch(state.store);

if (state.allowedPaths)
state.allowedPaths->insert(tree.actualPath);
state.allowPath(tree.actualPath);

emitTreeAttrs(state, tree, input2, v, params.emptyRevFallback, false);
}
Expand Down Expand Up @@ -245,8 +244,7 @@ static void fetch(EvalState & state, const Pos & pos, Value * * args, Value & v,
*url, expectedHash->to_string(Base32, true), hash.to_string(Base32, true));
}

if (state.allowedPaths)
state.allowedPaths->insert(realPath);
state.allowPath(realPath);

auto path = state.store->printStorePath(storePath);
mkString(v, path, PathSet({path}));
Expand Down
6 changes: 2 additions & 4 deletions src/nix/profile.cc
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,8 @@ struct ProfileManifest

else if (pathExists(profile + "/manifest.nix")) {
// FIXME: needed because of pure mode; ugly.
if (state.allowedPaths) {
state.allowedPaths->insert(state.store->followLinksToStore(profile));
state.allowedPaths->insert(state.store->followLinksToStore(profile + "/manifest.nix"));
}
state.allowPath(state.store->followLinksToStore(profile));
state.allowPath(state.store->followLinksToStore(profile + "/manifest.nix"));

auto drvInfos = queryInstalled(state, state.store->followLinksToStore(profile));

Expand Down

0 comments on commit 302c3a0

Please sign in to comment.