Skip to content

Commit

Permalink
Fix sandbox fallback settings
Browse files Browse the repository at this point in the history
The tmpDirInSandbox is different when in sandboxed vs. non-sandboxed.
Since we don’t know ahead of time here whether sandboxing is enabled,
we need to reset all of the env vars we’ve set previously. This fixes
the issue encountered in NixOS/nixpkgs#70856.
  • Loading branch information
matthewbauer committed Oct 12, 2019
1 parent bda64a2 commit 499b038
Showing 1 changed file with 34 additions and 26 deletions.
60 changes: 34 additions & 26 deletions src/libstore/build.cc
Expand Up @@ -956,6 +956,9 @@ class DerivationGoal : public Goal
/* Fill in the environment for the builder. */
void initEnv();

/* Setup tmp dir location. */
void initTmpDir();

/* Write a JSON file containing the derivation attributes. */
void writeStructuredAttrs();

Expand Down Expand Up @@ -2383,6 +2386,7 @@ void DerivationGoal::startBuilder()
if (res != 0 && settings.sandboxFallback) {
useChroot = false;
tmpDirInSandbox = tmpDir;
initTmpDir();
goto fallback;
} else if (res != 0)
throw Error("unable to start build process");
Expand Down Expand Up @@ -2438,32 +2442,7 @@ void DerivationGoal::startBuilder()
}


void DerivationGoal::initEnv()
{
env.clear();

/* Most shells initialise PATH to some default (/bin:/usr/bin:...) when
PATH is not set. We don't want this, so we fill it in with some dummy
value. */
env["PATH"] = "/path-not-set";

/* Set HOME to a non-existing path to prevent certain programs from using
/etc/passwd (or NIS, or whatever) to locate the home directory (for
example, wget looks for ~/.wgetrc). I.e., these tools use /etc/passwd
if HOME is not set, but they will just assume that the settings file
they are looking for does not exist if HOME is set but points to some
non-existing path. */
env["HOME"] = homeDir;

/* Tell the builder where the Nix store is. Usually they
shouldn't care, but this is useful for purity checking (e.g.,
the compiler or linker might only want to accept paths to files
in the store or in the build directory). */
env["NIX_STORE"] = worker.store.storeDir;

/* The maximum number of cores to utilize for parallel building. */
env["NIX_BUILD_CORES"] = (format("%d") % settings.buildCores).str();

void DerivationGoal::initTmpDir() {
/* In non-structured mode, add all bindings specified in the
derivation via the environment, except those listed in the
passAsFile attribute. Those are passed as file names pointing
Expand Down Expand Up @@ -2501,6 +2480,35 @@ void DerivationGoal::initEnv()
inode of the current directory doesn't appear in .. (because
getdents returns the inode of the mount point). */
env["PWD"] = tmpDirInSandbox;
}

void DerivationGoal::initEnv()
{
env.clear();

/* Most shells initialise PATH to some default (/bin:/usr/bin:...) when
PATH is not set. We don't want this, so we fill it in with some dummy
value. */
env["PATH"] = "/path-not-set";

/* Set HOME to a non-existing path to prevent certain programs from using
/etc/passwd (or NIS, or whatever) to locate the home directory (for
example, wget looks for ~/.wgetrc). I.e., these tools use /etc/passwd
if HOME is not set, but they will just assume that the settings file
they are looking for does not exist if HOME is set but points to some
non-existing path. */
env["HOME"] = homeDir;

/* Tell the builder where the Nix store is. Usually they
shouldn't care, but this is useful for purity checking (e.g.,
the compiler or linker might only want to accept paths to files
in the store or in the build directory). */
env["NIX_STORE"] = worker.store.storeDir;

/* The maximum number of cores to utilize for parallel building. */
env["NIX_BUILD_CORES"] = (format("%d") % settings.buildCores).str();

initTmpDir();

/* Compatibility hack with Nix <= 0.7: if this is a fixed-output
derivation, tell the builder, so that for instance `fetchurl'
Expand Down

0 comments on commit 499b038

Please sign in to comment.