summary refs log tree commit diff
diff options
context:
space:
mode:
authorJörg Thalheim <joerg@thalheim.io>2020-12-08 12:10:47 +0100
committerJörg Thalheim <joerg@thalheim.io>2020-12-27 17:19:49 +0100
commit66c16e12fa0ba419695369df397e854aa7a3a7d2 (patch)
tree4151627573d74976a1d76596b3af15fc11c78604
parent534a3330a6885eaab301a1d6b4298191be11154b (diff)
downloadnixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.tar
nixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.tar.gz
nixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.tar.bz2
nixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.tar.lz
nixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.tar.xz
nixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.tar.zst
nixpkgs-66c16e12fa0ba419695369df397e854aa7a3a7d2.zip
buildFhsUserenv: don't downgrade root user
-rw-r--r--pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c b/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c
index dcb2e97aa93..a438b80e182 100644
--- a/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c
+++ b/pkgs/build-support/build-fhs-userenv/chrootenv/chrootenv.c
@@ -43,6 +43,7 @@ const gchar *create_tmpdir() {
 void pivot_host(const gchar *guest) {
   g_autofree gchar *point = g_build_filename(guest, "host", NULL);
   fail_if(g_mkdir(point, 0755));
+  fail_if(mount(0, "/", 0, MS_PRIVATE | MS_REC, 0));
   fail_if(pivot_root(guest, point));
 }
 
@@ -56,6 +57,7 @@ void bind_mount_item(const gchar *host, const gchar *guest, const gchar *name) {
 
 void bind(const gchar *host, const gchar *guest) {
   mount_tmpfs(guest);
+
   pivot_host(guest);
 
   g_autofree gchar *host_dir = g_build_filename("/host", host, NULL);
@@ -105,7 +107,11 @@ int main(gint argc, gchar **argv) {
     uid_t uid = getuid();
     gid_t gid = getgid();
 
-    if (unshare(CLONE_NEWNS | CLONE_NEWUSER) < 0) {
+    int namespaces = CLONE_NEWNS;
+    if (uid != 0) {
+      namespaces |= CLONE_NEWUSER;
+    }
+    if (unshare(namespaces) < 0) {
       int unshare_errno = errno;
 
       g_message("Requires Linux version >= 3.19 built with CONFIG_USER_NS");
@@ -116,9 +122,11 @@ int main(gint argc, gchar **argv) {
       fail("unshare", unshare_errno);
     }
 
-    spit("/proc/self/setgroups", "deny");
-    spit("/proc/self/uid_map", "%d %d 1", uid, uid);
-    spit("/proc/self/gid_map", "%d %d 1", gid, gid);
+    if (uid != 0) {
+      spit("/proc/self/setgroups", "deny");
+      spit("/proc/self/uid_map", "%d %d 1", uid, uid);
+      spit("/proc/self/gid_map", "%d %d 1", gid, gid);
+    }
 
     // If there is a /host directory, assume this is nested chrootenv and use it as host instead.
     gboolean nested_host = g_file_test("/host", G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR);