aboutsummaryrefslogtreecommitdiffhomepage
path: root/sandbox/sysctl.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-03-26 06:19:19 +0900
committerOphestra <cat@gensokyo.uk>2025-03-26 06:19:19 +0900
commit8b69bcd2154fdc7903aceca662e9694588c982f2 (patch)
tree940b950d79125a2541f8226249894e5c7c27c630 /sandbox/sysctl.go
parent2dd49c437c19fcd55ce22e732b544d22b91a6342 (diff)
sandbox: cache kernel.cap_last_cap value
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'sandbox/sysctl.go')
-rw-r--r--sandbox/sysctl.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/sandbox/sysctl.go b/sandbox/sysctl.go
new file mode 100644
index 00000000..22046b65
--- /dev/null
+++ b/sandbox/sysctl.go
@@ -0,0 +1,47 @@
+package sandbox
+
+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) }