From 24ec7500032c2434e450b7bc3f77ff4c1f12c41c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 26 Feb 2018 18:29:40 +0100 Subject: [PATCH] nix run: Fix segfault on macOS Note that clearenv() is not available on macOS. Fixes #1907. --- src/libutil/util.cc | 7 +++++++ src/libutil/util.hh | 3 +++ src/nix/run.cc | 4 +--- 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 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 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 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);