summaryrefslogtreecommitdiff
path: root/vendor/github.com/opencontainers/runc/libcontainer/userns/userns_linux.go
blob: 724e6df0120e31fe808f68c8de087d01409af7d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package userns

import (
	"sync"

	"github.com/opencontainers/runc/libcontainer/user"
)

var (
	inUserNS bool
	nsOnce   sync.Once
)

// runningInUserNS detects whether we are currently running in a user namespace.
// Originally copied from github.com/lxc/lxd/shared/util.go
func runningInUserNS() bool {
	nsOnce.Do(func() {
		uidmap, err := user.CurrentProcessUIDMap()
		if err != nil {
			// This kernel-provided file only exists if user namespaces are supported
			return
		}
		inUserNS = uidMapInUserNS(uidmap)
	})
	return inUserNS
}

func uidMapInUserNS(uidmap []user.IDMap) bool {
	/*
	 * We assume we are in the initial user namespace if we have a full
	 * range - 4294967295 uids starting at uid 0.
	 */
	if len(uidmap) == 1 && uidmap[0].ID == 0 && uidmap[0].ParentID == 0 && uidmap[0].Count == 4294967295 {
		return false
	}
	return true
}