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  }