diff --git a/libcontainer/userns/userns.go b/libcontainer/userns/userns.go index b225f18f2..a07afe07b 100644 --- a/libcontainer/userns/userns.go +++ b/libcontainer/userns/userns.go @@ -1,4 +1,8 @@ package userns -// RunningInUserNS detects whether we are currently running in a user namespace. -var RunningInUserNS = runningInUserNS +// RunningInUserNS detects whether we are currently running in a Linux +// user namespace and memoizes the result. It returns false on non-Linux +// platforms. +func RunningInUserNS() bool { + return inUserNS() +} diff --git a/libcontainer/userns/userns_linux.go b/libcontainer/userns/userns_linux.go index a6710b321..a1462e13b 100644 --- a/libcontainer/userns/userns_linux.go +++ b/libcontainer/userns/userns_linux.go @@ -7,32 +7,26 @@ import ( "sync" ) -var ( - inUserNS bool - nsOnce sync.Once -) +var inUserNS = sync.OnceValue(runningInUserNS) // runningInUserNS detects whether we are currently running in a user namespace. // // Originally copied from https://github.com/lxc/incus/blob/e45085dd42f826b3c8c3228e9733c0b6f998eafe/shared/util.go#L678-L700. func runningInUserNS() bool { - nsOnce.Do(func() { - file, err := os.Open("/proc/self/uid_map") - if err != nil { - // This kernel-provided file only exists if user namespaces are supported. - return - } - defer file.Close() + file, err := os.Open("/proc/self/uid_map") + if err != nil { + // This kernel-provided file only exists if user namespaces are supported. + return false + } + defer file.Close() - buf := bufio.NewReader(file) - l, _, err := buf.ReadLine() - if err != nil { - return - } + buf := bufio.NewReader(file) + l, _, err := buf.ReadLine() + if err != nil { + return false + } - inUserNS = uidMapInUserNS(string(l)) - }) - return inUserNS + return uidMapInUserNS(string(l)) } func uidMapInUserNS(uidMap string) bool { diff --git a/libcontainer/userns/userns_fuzzer.go b/libcontainer/userns/userns_linux_fuzzer.go similarity index 79% rename from libcontainer/userns/userns_fuzzer.go rename to libcontainer/userns/userns_linux_fuzzer.go index d90cffcf4..26ba2e16e 100644 --- a/libcontainer/userns/userns_fuzzer.go +++ b/libcontainer/userns/userns_linux_fuzzer.go @@ -1,4 +1,4 @@ -//go:build gofuzz +//go:build linux && gofuzz package userns diff --git a/libcontainer/userns/userns_unsupported.go b/libcontainer/userns/userns_unsupported.go index 71d4c6353..8ed83072c 100644 --- a/libcontainer/userns/userns_unsupported.go +++ b/libcontainer/userns/userns_unsupported.go @@ -2,14 +2,5 @@ package userns -// runningInUserNS is a stub for non-Linux systems -// Always returns false -func runningInUserNS() bool { - return false -} - -// uidMapInUserNS is a stub for non-Linux systems -// Always returns false -func uidMapInUserNS(uidMap string) bool { - return false -} +// inUserNS is a stub for non-Linux systems. Always returns false. +func inUserNS() bool { return false }