From: Michael Hudson-Doyle Date: Wed, 25 Nov 2015 22:47:32 +0000 (+1300) Subject: syscall: skip tests that create a user namespace when chrooted X-Git-Tag: go1.6beta1~286 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=21efa7b2bc872958bcb252f5ab4dc52b2b0abeae;p=gostls13.git syscall: skip tests that create a user namespace when chrooted The kernel rejects attempts to create user namespaces when in a chroot. Change-Id: I6548302732c8f5be52f4167cd7233aea16839ad8 Reviewed-on: https://go-review.googlesource.com/17214 Reviewed-by: Ian Lance Taylor TryBot-Result: Gobot Gobot --- diff --git a/src/syscall/exec_linux_test.go b/src/syscall/exec_linux_test.go index cca3812a9e..6d31941184 100644 --- a/src/syscall/exec_linux_test.go +++ b/src/syscall/exec_linux_test.go @@ -15,6 +15,17 @@ import ( "testing" ) +// Check if we are in a chroot by checking if the inode of / is +// different from 2 (there is no better test available to non-root on +// linux). +func isChrooted(t *testing.T) bool { + root, err := os.Stat("/") + if err != nil { + t.Fatalf("cannot stat /: %v", err) + } + return root.Sys().(*syscall.Stat_t).Ino != 2 +} + func whoamiCmd(t *testing.T, uid, gid int, setgroups bool) *exec.Cmd { if _, err := os.Stat("/proc/self/ns/user"); err != nil { if os.IsNotExist(err) { @@ -22,6 +33,12 @@ func whoamiCmd(t *testing.T, uid, gid int, setgroups bool) *exec.Cmd { } t.Fatalf("Failed to stat /proc/self/ns/user: %v", err) } + if isChrooted(t) { + // create_user_ns in the kernel (see + // https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/user_namespace.c) + // forbids the creation of user namespaces when chrooted. + t.Skip("cannot create user namespaces when chrooted") + } // On some systems, there is a sysctl setting. if os.Getuid() != 0 { data, errRead := ioutil.ReadFile("/proc/sys/kernel/unprivileged_userns_clone")