github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/profiles/seccomp/kernel_linux.go (about) 1 package seccomp 2 3 import ( 4 "fmt" 5 "sync" 6 7 "golang.org/x/sys/unix" 8 ) 9 10 var ( 11 currentKernelVersion *KernelVersion 12 kernelVersionError error 13 once sync.Once 14 ) 15 16 // getKernelVersion gets the current kernel version. 17 func getKernelVersion() (*KernelVersion, error) { 18 once.Do(func() { 19 var uts unix.Utsname 20 if err := unix.Uname(&uts); err != nil { 21 return 22 } 23 // Remove the \x00 from the release for Atoi to parse correctly 24 currentKernelVersion, kernelVersionError = parseRelease(unix.ByteSliceToString(uts.Release[:])) 25 }) 26 return currentKernelVersion, kernelVersionError 27 } 28 29 // parseRelease parses a string and creates a KernelVersion based on it. 30 func parseRelease(release string) (*KernelVersion, error) { 31 version := KernelVersion{} 32 33 // We're only make sure we get the "kernel" and "major revision". Sometimes we have 34 // 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64. 35 _, err := fmt.Sscanf(release, "%d.%d", &version.Kernel, &version.Major) 36 if err != nil { 37 return nil, fmt.Errorf("failed to parse kernel version %q: %w", release, err) 38 } 39 return &version, nil 40 } 41 42 // kernelGreaterEqualThan checks if the host's kernel version is greater than, or 43 // equal to the given kernel version v. Only "kernel version" and "major revision" 44 // can be specified (e.g., "3.12") and will be taken into account, which means 45 // that 3.12.25-gentoo and 3.12-1-amd64 are considered equal (kernel: 3, major: 12). 46 func kernelGreaterEqualThan(minVersion KernelVersion) (bool, error) { 47 kv, err := getKernelVersion() 48 if err != nil { 49 return false, err 50 } 51 if kv.Kernel > minVersion.Kernel { 52 return true, nil 53 } 54 if kv.Kernel == minVersion.Kernel && kv.Major >= minVersion.Major { 55 return true, nil 56 } 57 return false, nil 58 }