summary refs log tree commit diff
path: root/pkgs/build-support/build-fhs-userenv
diff options
context:
space:
mode:
authorYegor Timoshenko <yegortimoshenko@gmail.com>2017-12-20 19:32:17 +0000
committerYegor Timoshenko <yegortimoshenko@gmail.com>2017-12-22 18:56:13 +0300
commit710662be948d9013390241469c877dc97ca19e1a (patch)
tree7c699ae26bec5a40f8f53b88f252a946645c1747 /pkgs/build-support/build-fhs-userenv
parent0234cd41b4458caeb722d0b2de55be23a1e5af15 (diff)
downloadnixpkgs-710662be948d9013390241469c877dc97ca19e1a.tar
nixpkgs-710662be948d9013390241469c877dc97ca19e1a.tar.gz
nixpkgs-710662be948d9013390241469c877dc97ca19e1a.tar.bz2
nixpkgs-710662be948d9013390241469c877dc97ca19e1a.tar.lz
nixpkgs-710662be948d9013390241469c877dc97ca19e1a.tar.xz
nixpkgs-710662be948d9013390241469c877dc97ca19e1a.tar.zst
nixpkgs-710662be948d9013390241469c877dc97ca19e1a.zip
chrootenv: error on chrootenv-inside-chrootenv, resolves #32802
Diffstat (limited to 'pkgs/build-support/build-fhs-userenv')
-rw-r--r--pkgs/build-support/build-fhs-userenv/chrootenv.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/pkgs/build-support/build-fhs-userenv/chrootenv.c b/pkgs/build-support/build-fhs-userenv/chrootenv.c
index 73c8763c048..d88fc045377 100644
--- a/pkgs/build-support/build-fhs-userenv/chrootenv.c
+++ b/pkgs/build-support/build-fhs-userenv/chrootenv.c
@@ -155,7 +155,9 @@ int nftw_rm(const char *path, const struct stat *sb, int type,
 
 #define REQUIREMENTS "Linux version >= 3.19 built with CONFIG_USER_NS option"
 
-int main(int argc, char *argv[], char *envp[]) {
+extern char **environ;
+
+int main(int argc, char *argv[]) {
   if (argc < 2) {
     fprintf(stderr, "Usage: %s command [arguments...]\n"
                     "Requires " REQUIREMENTS ".\n",
@@ -163,6 +165,12 @@ int main(int argc, char *argv[], char *envp[]) {
     exit(EX_USAGE);
   }
 
+  if (getenv("NIX_CHROOTENV") != NULL)
+    errorf(EX_USAGE, "can't create chrootenv inside chrootenv");
+
+  if (setenv("NIX_CHROOTENV", "1", false) < 0)
+    errorf(EX_IOERR, "setenv");
+
   char tmpl[] = "/tmp/chrootenvXXXXXX";
   char *root = mkdtemp(tmpl);
 
@@ -222,7 +230,7 @@ int main(int argc, char *argv[], char *envp[]) {
 
     argv++;
 
-    if (execvpe(*argv, argv, env_filter(envp)) < 0)
+    if (execvpe(*argv, argv, env_filter(environ)) < 0)
       errorf(EX_OSERR, "execvpe");
   }