mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-10 08:16:15 +02:00
flakes: check for flake.nix before complaining that lstat on it fails
getFlake currently calls lstat (via isLink via canonPath) before it performs the sanity check that a flake.nix exists in the first place. This commit moves the check to before path canonicalization, so that failed symlink check operations don't throw before the check does.
This commit is contained in:
parent
fb68699456
commit
19993398a1
1 changed files with 9 additions and 4 deletions
|
@ -212,8 +212,16 @@ static Flake getFlake(
|
||||||
auto [storePath, resolvedRef, lockedRef] = fetchOrSubstituteTree(
|
auto [storePath, resolvedRef, lockedRef] = fetchOrSubstituteTree(
|
||||||
state, originalRef, allowLookup, flakeCache);
|
state, originalRef, allowLookup, flakeCache);
|
||||||
|
|
||||||
|
// We need to guard against symlink attacks, but before we start doing
|
||||||
|
// filesystem operations we should make sure there's a flake.nix in the
|
||||||
|
// first place.
|
||||||
|
auto unsafeFlakeDir = state.store->toRealPath(storePath) + "/" + lockedRef.subdir;
|
||||||
|
auto unsafeFlakeFile = unsafeFlakeDir + "/flake.nix";
|
||||||
|
if (!pathExists(unsafeFlakeFile))
|
||||||
|
throw Error("source tree referenced by '%s' does not contain a '%s/flake.nix' file", lockedRef, lockedRef.subdir);
|
||||||
|
|
||||||
// Guard against symlink attacks.
|
// Guard against symlink attacks.
|
||||||
auto flakeDir = canonPath(state.store->toRealPath(storePath) + "/" + lockedRef.subdir, true);
|
auto flakeDir = canonPath(unsafeFlakeDir, true);
|
||||||
auto flakeFile = canonPath(flakeDir + "/flake.nix", true);
|
auto flakeFile = canonPath(flakeDir + "/flake.nix", true);
|
||||||
if (!isInDir(flakeFile, state.store->toRealPath(storePath)))
|
if (!isInDir(flakeFile, state.store->toRealPath(storePath)))
|
||||||
throw Error("'flake.nix' file of flake '%s' escapes from '%s'",
|
throw Error("'flake.nix' file of flake '%s' escapes from '%s'",
|
||||||
|
@ -226,9 +234,6 @@ static Flake getFlake(
|
||||||
.storePath = storePath,
|
.storePath = storePath,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!pathExists(flakeFile))
|
|
||||||
throw Error("source tree referenced by '%s' does not contain a '%s/flake.nix' file", lockedRef, lockedRef.subdir);
|
|
||||||
|
|
||||||
Value vInfo;
|
Value vInfo;
|
||||||
state.evalFile(state.rootPath(CanonPath(flakeFile)), vInfo, true); // FIXME: symlink attack
|
state.evalFile(state.rootPath(CanonPath(flakeFile)), vInfo, true); // FIXME: symlink attack
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue