aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2018-02-26 18:29:40 +0100
committerEelco Dolstra <edolstra@gmail.com>2018-02-26 18:29:40 +0100
commit24ec7500032c2434e450b7bc3f77ff4c1f12c41c (patch)
treee3223f8f682d89f612aeb0f2c5ad8efe4472c9c4 /src
parent9432f3fb7d3614bf121399cdd83c82065efedbb2 (diff)
nix run: Fix segfault on macOS
Note that clearenv() is not available on macOS. Fixes #1907.
Diffstat (limited to 'src')
-rw-r--r--src/libutil/util.cc7
-rw-r--r--src/libutil/util.hh3
-rw-r--r--src/nix/run.cc4
3 files changed, 11 insertions, 3 deletions
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 341dedfdf..2391e14a9 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -73,6 +73,13 @@ std::map<std::string, std::string> getEnv()
}
+void clearEnv()
+{
+ for (auto & name : getEnv())
+ unsetenv(name.first.c_str());
+}
+
+
Path absPath(Path path, Path dir)
{
if (path[0] != '/') {
diff --git a/src/libutil/util.hh b/src/libutil/util.hh
index 47e02bc89..c5c537ee6 100644
--- a/src/libutil/util.hh
+++ b/src/libutil/util.hh
@@ -32,6 +32,9 @@ string getEnv(const string & key, const string & def = "");
/* Get the entire environment. */
std::map<std::string, std::string> getEnv();
+/* Clear the environment. */
+void clearEnv();
+
/* Return an absolutized path, resolving paths relative to the
specified directory, or the current directory otherwise. The path
is also canonicalised. */
diff --git a/src/nix/run.cc b/src/nix/run.cc
index 822654daf..d04e106e0 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -16,8 +16,6 @@ using namespace nix;
std::string chrootHelperName = "__run_in_chroot";
-extern char * * environ;
-
struct CmdRun : InstallablesCommand
{
std::vector<std::string> command = { "bash" };
@@ -109,7 +107,7 @@ struct CmdRun : InstallablesCommand
if (s) kept[var] = s;
}
- environ = nullptr;
+ clearEnv();
for (auto & var : kept)
setenv(var.first.c_str(), var.second.c_str(), 1);