aboutsummaryrefslogtreecommitdiffhomepage
path: root/container/sysctl.go
blob: 7fcb94bd1586a7f71805b6ac3f7c671b50e5ef95 (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
38
39
40
41
42
43
44
45
46
47
package container

import (
	"bytes"
	"log"
	"os"
	"strconv"
	"sync"
)

var (
	kernelOverflowuid int
	kernelOverflowgid int
	kernelCapLastCap  int

	sysctlOnce sync.Once
)

const (
	kernelOverflowuidPath = "/proc/sys/kernel/overflowuid"
	kernelOverflowgidPath = "/proc/sys/kernel/overflowgid"
	kernelCapLastCapPath  = "/proc/sys/kernel/cap_last_cap"
)

func mustReadSysctl() {
	if v, err := os.ReadFile(kernelOverflowuidPath); err != nil {
		log.Fatalf("cannot read %q: %v", kernelOverflowuidPath, err)
	} else if kernelOverflowuid, err = strconv.Atoi(string(bytes.TrimSpace(v))); err != nil {
		log.Fatalf("cannot interpret %q: %v", kernelOverflowuidPath, err)
	}

	if v, err := os.ReadFile(kernelOverflowgidPath); err != nil {
		log.Fatalf("cannot read %q: %v", kernelOverflowgidPath, err)
	} else if kernelOverflowgid, err = strconv.Atoi(string(bytes.TrimSpace(v))); err != nil {
		log.Fatalf("cannot interpret %q: %v", kernelOverflowgidPath, err)
	}

	if v, err := os.ReadFile(kernelCapLastCapPath); err != nil {
		log.Fatalf("cannot read %q: %v", kernelCapLastCapPath, err)
	} else if kernelCapLastCap, err = strconv.Atoi(string(bytes.TrimSpace(v))); err != nil {
		log.Fatalf("cannot interpret %q: %v", kernelCapLastCapPath, err)
	}
}

func OverflowUid() int { sysctlOnce.Do(mustReadSysctl); return kernelOverflowuid }
func OverflowGid() int { sysctlOnce.Do(mustReadSysctl); return kernelOverflowgid }
func LastCap() uintptr { sysctlOnce.Do(mustReadSysctl); return uintptr(kernelCapLastCap) }