mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-30 17:58:14 +00:00 
			
		
		
		
	dependencies: update opencontainers/selinux to v1.11.0
Signed-off-by: Akhil Mohan <akhilerm@gmail.com>
This commit is contained in:
		
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							| @@ -54,7 +54,7 @@ require ( | ||||
| 	github.com/onsi/ginkgo/v2 v2.9.4 | ||||
| 	github.com/onsi/gomega v1.27.6 | ||||
| 	github.com/opencontainers/runc v1.1.9 | ||||
| 	github.com/opencontainers/selinux v1.10.0 | ||||
| 	github.com/opencontainers/selinux v1.11.0 | ||||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/pmezard/go-difflib v1.0.0 | ||||
| 	github.com/prometheus/client_golang v1.16.0 | ||||
|   | ||||
							
								
								
									
										3
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								go.sum
									
									
									
									
									
								
							| @@ -693,8 +693,9 @@ github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.m | ||||
| github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78 h1:R5M2qXZiK/mWPMT4VldCOiSL9HIAMuxQZWdG0CSM5+4= | ||||
| github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= | ||||
| github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= | ||||
| github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= | ||||
| github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= | ||||
| github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= | ||||
| github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= | ||||
| github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -9,6 +9,5 @@ Usage: | ||||
| 	if selinux.EnforceMode() != selinux.Enforcing { | ||||
| 		selinux.SetEnforceMode(selinux.Enforcing) | ||||
| 	} | ||||
|  | ||||
| */ | ||||
| package selinux | ||||
|   | ||||
							
								
								
									
										22
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -78,6 +78,9 @@ func ReleaseLabel(label string) error { | ||||
| // Deprecated: use selinux.DupSecOpt | ||||
| var DupSecOpt = selinux.DupSecOpt | ||||
|  | ||||
| // FormatMountLabel returns a string to be used by the mount command. Using | ||||
| // the SELinux `context` mount option. Changing labels of files on mount | ||||
| // points with this option can never be changed. | ||||
| // FormatMountLabel returns a string to be used by the mount command. | ||||
| // The format of this string will be used to alter the labeling of the mountpoint. | ||||
| // The string returned is suitable to be used as the options field of the mount command. | ||||
| @@ -85,12 +88,27 @@ var DupSecOpt = selinux.DupSecOpt | ||||
| // the first parameter.  Second parameter is the label that you wish to apply | ||||
| // to all content in the mount point. | ||||
| func FormatMountLabel(src, mountLabel string) string { | ||||
| 	return FormatMountLabelByType(src, mountLabel, "context") | ||||
| } | ||||
|  | ||||
| // FormatMountLabelByType returns a string to be used by the mount command. | ||||
| // Allow caller to specify the mount options. For example using the SELinux | ||||
| // `fscontext` mount option would allow certain container processes to change | ||||
| // labels of files created on the mount points, where as `context` option does | ||||
| // not. | ||||
| // FormatMountLabelByType returns a string to be used by the mount command. | ||||
| // The format of this string will be used to alter the labeling of the mountpoint. | ||||
| // The string returned is suitable to be used as the options field of the mount command. | ||||
| // If you need to have additional mount point options, you can pass them in as | ||||
| // the first parameter.  Second parameter is the label that you wish to apply | ||||
| // to all content in the mount point. | ||||
| func FormatMountLabelByType(src, mountLabel, contextType string) string { | ||||
| 	if mountLabel != "" { | ||||
| 		switch src { | ||||
| 		case "": | ||||
| 			src = fmt.Sprintf("context=%q", mountLabel) | ||||
| 			src = fmt.Sprintf("%s=%q", contextType, mountLabel) | ||||
| 		default: | ||||
| 			src = fmt.Sprintf("%s,context=%q", src, mountLabel) | ||||
| 			src = fmt.Sprintf("%s,%s=%q", src, contextType, mountLabel) | ||||
| 		} | ||||
| 	} | ||||
| 	return src | ||||
|   | ||||
							
								
								
									
										46
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										46
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -3,8 +3,6 @@ package label | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"os/user" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/opencontainers/selinux/go-selinux" | ||||
| @@ -113,50 +111,6 @@ func Relabel(path string, fileLabel string, shared bool) error { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	exclude_paths := map[string]bool{ | ||||
| 		"/":           true, | ||||
| 		"/bin":        true, | ||||
| 		"/boot":       true, | ||||
| 		"/dev":        true, | ||||
| 		"/etc":        true, | ||||
| 		"/etc/passwd": true, | ||||
| 		"/etc/pki":    true, | ||||
| 		"/etc/shadow": true, | ||||
| 		"/home":       true, | ||||
| 		"/lib":        true, | ||||
| 		"/lib64":      true, | ||||
| 		"/media":      true, | ||||
| 		"/opt":        true, | ||||
| 		"/proc":       true, | ||||
| 		"/root":       true, | ||||
| 		"/run":        true, | ||||
| 		"/sbin":       true, | ||||
| 		"/srv":        true, | ||||
| 		"/sys":        true, | ||||
| 		"/tmp":        true, | ||||
| 		"/usr":        true, | ||||
| 		"/var":        true, | ||||
| 		"/var/lib":    true, | ||||
| 		"/var/log":    true, | ||||
| 	} | ||||
|  | ||||
| 	if home := os.Getenv("HOME"); home != "" { | ||||
| 		exclude_paths[home] = true | ||||
| 	} | ||||
|  | ||||
| 	if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" { | ||||
| 		if usr, err := user.Lookup(sudoUser); err == nil { | ||||
| 			exclude_paths[usr.HomeDir] = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if path != "/" { | ||||
| 		path = strings.TrimSuffix(path, "/") | ||||
| 	} | ||||
| 	if exclude_paths[path] { | ||||
| 		return fmt.Errorf("SELinux relabeling of %s is not allowed", path) | ||||
| 	} | ||||
|  | ||||
| 	if shared { | ||||
| 		c, err := selinux.NewContext(fileLabel) | ||||
| 		if err != nil { | ||||
|   | ||||
							
								
								
									
										1
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| //go:build !linux | ||||
| // +build !linux | ||||
|  | ||||
| package label | ||||
|   | ||||
							
								
								
									
										22
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/rchcon.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/rchcon.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,22 +0,0 @@ | ||||
| // +build linux,go1.16 | ||||
|  | ||||
| package selinux | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"io/fs" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/opencontainers/selinux/pkg/pwalkdir" | ||||
| ) | ||||
|  | ||||
| func rchcon(fpath, label string) error { | ||||
| 	return pwalkdir.Walk(fpath, func(p string, _ fs.DirEntry, _ error) error { | ||||
| 		e := setFileLabel(p, label) | ||||
| 		// Walk a file tree can race with removal, so ignore ENOENT. | ||||
| 		if errors.Is(e, os.ErrNotExist) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return e | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										21
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/rchcon_go115.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										21
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/rchcon_go115.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,21 +0,0 @@ | ||||
| // +build linux,!go1.16 | ||||
|  | ||||
| package selinux | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"os" | ||||
|  | ||||
| 	"github.com/opencontainers/selinux/pkg/pwalk" | ||||
| ) | ||||
|  | ||||
| func rchcon(fpath, label string) error { | ||||
| 	return pwalk.Walk(fpath, func(p string, _ os.FileInfo, _ error) error { | ||||
| 		e := setFileLabel(p, label) | ||||
| 		// Walk a file tree can race with removal, so ignore ENOENT. | ||||
| 		if errors.Is(e, os.ErrNotExist) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return e | ||||
| 	}) | ||||
| } | ||||
							
								
								
									
										30
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -23,8 +23,13 @@ var ( | ||||
| 	// ErrEmptyPath is returned when an empty path has been specified. | ||||
| 	ErrEmptyPath = errors.New("empty path") | ||||
|  | ||||
| 	// ErrInvalidLabel is returned when an invalid label is specified. | ||||
| 	ErrInvalidLabel = errors.New("invalid Label") | ||||
|  | ||||
| 	// InvalidLabel is returned when an invalid label is specified. | ||||
| 	InvalidLabel = errors.New("Invalid Label") | ||||
| 	// | ||||
| 	// Deprecated: use [ErrInvalidLabel]. | ||||
| 	InvalidLabel = ErrInvalidLabel | ||||
|  | ||||
| 	// ErrIncomparable is returned two levels are not comparable | ||||
| 	ErrIncomparable = errors.New("incomparable levels") | ||||
| @@ -144,7 +149,7 @@ func CalculateGlbLub(sourceRange, targetRange string) (string, error) { | ||||
| // of the program is finished to guarantee another goroutine does not migrate to the current | ||||
| // thread before execution is complete. | ||||
| func SetExecLabel(label string) error { | ||||
| 	return setExecLabel(label) | ||||
| 	return writeCon(attrPath("exec"), label) | ||||
| } | ||||
|  | ||||
| // SetTaskLabel sets the SELinux label for the current thread, or an error. | ||||
| @@ -152,21 +157,21 @@ func SetExecLabel(label string) error { | ||||
| // be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() to guarantee | ||||
| // the current thread does not run in a new mislabeled thread. | ||||
| func SetTaskLabel(label string) error { | ||||
| 	return setTaskLabel(label) | ||||
| 	return writeCon(attrPath("current"), label) | ||||
| } | ||||
|  | ||||
| // SetSocketLabel takes a process label and tells the kernel to assign the | ||||
| // label to the next socket that gets created. Calls to SetSocketLabel | ||||
| // should be wrapped in runtime.LockOSThread()/runtime.UnlockOSThread() until | ||||
| // the the socket is created to guarantee another goroutine does not migrate | ||||
| // the socket is created to guarantee another goroutine does not migrate | ||||
| // to the current thread before execution is complete. | ||||
| func SetSocketLabel(label string) error { | ||||
| 	return setSocketLabel(label) | ||||
| 	return writeCon(attrPath("sockcreate"), label) | ||||
| } | ||||
|  | ||||
| // SocketLabel retrieves the current socket label setting | ||||
| func SocketLabel() (string, error) { | ||||
| 	return socketLabel() | ||||
| 	return readCon(attrPath("sockcreate")) | ||||
| } | ||||
|  | ||||
| // PeerLabel retrieves the label of the client on the other side of a socket | ||||
| @@ -185,7 +190,7 @@ func SetKeyLabel(label string) error { | ||||
|  | ||||
| // KeyLabel retrieves the current kernel keyring label setting | ||||
| func KeyLabel() (string, error) { | ||||
| 	return keyLabel() | ||||
| 	return readCon("/proc/self/attr/keycreate") | ||||
| } | ||||
|  | ||||
| // Get returns the Context as a string | ||||
| @@ -208,6 +213,11 @@ func ReserveLabel(label string) { | ||||
| 	reserveLabel(label) | ||||
| } | ||||
|  | ||||
| // MLSEnabled checks if MLS is enabled. | ||||
| func MLSEnabled() bool { | ||||
| 	return isMLSEnabled() | ||||
| } | ||||
|  | ||||
| // EnforceMode returns the current SELinux mode Enforcing, Permissive, Disabled | ||||
| func EnforceMode() int { | ||||
| 	return enforceMode() | ||||
| @@ -220,7 +230,7 @@ func SetEnforceMode(mode int) error { | ||||
| } | ||||
|  | ||||
| // DefaultEnforceMode returns the systems default SELinux mode Enforcing, | ||||
| // Permissive or Disabled. Note this is is just the default at boot time. | ||||
| // Permissive or Disabled. Note this is just the default at boot time. | ||||
| // EnforceMode tells you the systems current mode. | ||||
| func DefaultEnforceMode() int { | ||||
| 	return defaultEnforceMode() | ||||
| @@ -266,7 +276,7 @@ func CopyLevel(src, dest string) (string, error) { | ||||
| 	return copyLevel(src, dest) | ||||
| } | ||||
|  | ||||
| // Chcon changes the fpath file object to the SELinux label label. | ||||
| // Chcon changes the fpath file object to the SELinux label. | ||||
| // If fpath is a directory and recurse is true, then Chcon walks the | ||||
| // directory tree setting the label. | ||||
| // | ||||
| @@ -284,7 +294,7 @@ func DupSecOpt(src string) ([]string, error) { | ||||
| // DisableSecOpt returns a security opt that can be used to disable SELinux | ||||
| // labeling support for future container processes. | ||||
| func DisableSecOpt() []string { | ||||
| 	return disableSecOpt() | ||||
| 	return []string{"disable"} | ||||
| } | ||||
|  | ||||
| // GetDefaultContextWithLevel gets a single context for the specified SELinux user | ||||
|   | ||||
							
								
								
									
										257
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										257
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,15 +8,16 @@ import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"io/fs" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"os/user" | ||||
| 	"path/filepath" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
|  | ||||
| 	"github.com/opencontainers/selinux/pkg/pwalkdir" | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| @@ -34,17 +35,17 @@ const ( | ||||
| ) | ||||
|  | ||||
| type selinuxState struct { | ||||
| 	mcsList       map[string]bool | ||||
| 	selinuxfs     string | ||||
| 	selinuxfsOnce sync.Once | ||||
| 	enabledSet    bool | ||||
| 	enabled       bool | ||||
| 	selinuxfsOnce sync.Once | ||||
| 	selinuxfs     string | ||||
| 	mcsList       map[string]bool | ||||
| 	sync.Mutex | ||||
| } | ||||
|  | ||||
| type level struct { | ||||
| 	sens uint | ||||
| 	cats *big.Int | ||||
| 	sens uint | ||||
| } | ||||
|  | ||||
| type mlsRange struct { | ||||
| @@ -53,10 +54,10 @@ type mlsRange struct { | ||||
| } | ||||
|  | ||||
| type defaultSECtx struct { | ||||
| 	user, level, scon   string | ||||
| 	userRdr, defaultRdr io.Reader | ||||
|  | ||||
| 	verifier func(string) error | ||||
| 	userRdr           io.Reader | ||||
| 	verifier          func(string) error | ||||
| 	defaultRdr        io.Reader | ||||
| 	user, level, scon string | ||||
| } | ||||
|  | ||||
| type levelItem byte | ||||
| @@ -154,7 +155,7 @@ func findSELinuxfs() string { | ||||
| 	} | ||||
|  | ||||
| 	// check if selinuxfs is available before going the slow path | ||||
| 	fs, err := ioutil.ReadFile("/proc/filesystems") | ||||
| 	fs, err := os.ReadFile("/proc/filesystems") | ||||
| 	if err != nil { | ||||
| 		return "" | ||||
| 	} | ||||
| @@ -291,7 +292,7 @@ func readCon(fpath string) (string, error) { | ||||
| } | ||||
|  | ||||
| func readConFd(in *os.File) (string, error) { | ||||
| 	data, err := ioutil.ReadAll(in) | ||||
| 	data, err := io.ReadAll(in) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| @@ -304,7 +305,7 @@ func classIndex(class string) (int, error) { | ||||
| 	permpath := fmt.Sprintf("class/%s/index", class) | ||||
| 	indexpath := filepath.Join(getSelinuxMountPoint(), permpath) | ||||
|  | ||||
| 	indexB, err := ioutil.ReadFile(indexpath) | ||||
| 	indexB, err := os.ReadFile(indexpath) | ||||
| 	if err != nil { | ||||
| 		return -1, err | ||||
| 	} | ||||
| @@ -390,21 +391,19 @@ func lFileLabel(fpath string) (string, error) { | ||||
| 	return string(label), nil | ||||
| } | ||||
|  | ||||
| // setFSCreateLabel tells kernel the label to create all file system objects | ||||
| // created by this task. Setting label="" to return to default. | ||||
| func setFSCreateLabel(label string) error { | ||||
| 	return writeAttr("fscreate", label) | ||||
| 	return writeCon(attrPath("fscreate"), label) | ||||
| } | ||||
|  | ||||
| // fsCreateLabel returns the default label the kernel which the kernel is using | ||||
| // for file system objects created by this task. "" indicates default. | ||||
| func fsCreateLabel() (string, error) { | ||||
| 	return readAttr("fscreate") | ||||
| 	return readCon(attrPath("fscreate")) | ||||
| } | ||||
|  | ||||
| // currentLabel returns the SELinux label of the current process thread, or an error. | ||||
| func currentLabel() (string, error) { | ||||
| 	return readAttr("current") | ||||
| 	return readCon(attrPath("current")) | ||||
| } | ||||
|  | ||||
| // pidLabel returns the SELinux label of the given pid, or an error. | ||||
| @@ -415,7 +414,7 @@ func pidLabel(pid int) (string, error) { | ||||
| // ExecLabel returns the SELinux label that the kernel will use for any programs | ||||
| // that are executed by the current process thread, or an error. | ||||
| func execLabel() (string, error) { | ||||
| 	return readAttr("exec") | ||||
| 	return readCon(attrPath("exec")) | ||||
| } | ||||
|  | ||||
| func writeCon(fpath, val string) error { | ||||
| @@ -461,18 +460,10 @@ func attrPath(attr string) string { | ||||
| 	}) | ||||
|  | ||||
| 	if haveThreadSelf { | ||||
| 		return path.Join(threadSelfPrefix, attr) | ||||
| 		return filepath.Join(threadSelfPrefix, attr) | ||||
| 	} | ||||
|  | ||||
| 	return path.Join("/proc/self/task/", strconv.Itoa(unix.Gettid()), "/attr/", attr) | ||||
| } | ||||
|  | ||||
| func readAttr(attr string) (string, error) { | ||||
| 	return readCon(attrPath(attr)) | ||||
| } | ||||
|  | ||||
| func writeAttr(attr, val string) error { | ||||
| 	return writeCon(attrPath(attr), val) | ||||
| 	return filepath.Join("/proc/self/task", strconv.Itoa(unix.Gettid()), "attr", attr) | ||||
| } | ||||
|  | ||||
| // canonicalizeContext takes a context string and writes it to the kernel | ||||
| @@ -559,30 +550,30 @@ func (l *level) parseLevel(levelStr string) error { | ||||
|  | ||||
| // rangeStrToMLSRange marshals a string representation of a range. | ||||
| func rangeStrToMLSRange(rangeStr string) (*mlsRange, error) { | ||||
| 	mlsRange := &mlsRange{} | ||||
| 	levelSlice := strings.SplitN(rangeStr, "-", 2) | ||||
| 	r := &mlsRange{} | ||||
| 	l := strings.SplitN(rangeStr, "-", 2) | ||||
|  | ||||
| 	switch len(levelSlice) { | ||||
| 	switch len(l) { | ||||
| 	// rangeStr that has a low and a high level, e.g. s4:c0.c1023-s6:c0.c1023 | ||||
| 	case 2: | ||||
| 		mlsRange.high = &level{} | ||||
| 		if err := mlsRange.high.parseLevel(levelSlice[1]); err != nil { | ||||
| 			return nil, fmt.Errorf("failed to parse high level %q: %w", levelSlice[1], err) | ||||
| 		r.high = &level{} | ||||
| 		if err := r.high.parseLevel(l[1]); err != nil { | ||||
| 			return nil, fmt.Errorf("failed to parse high level %q: %w", l[1], err) | ||||
| 		} | ||||
| 		fallthrough | ||||
| 	// rangeStr that is single level, e.g. s6:c0,c3,c5,c30.c1023 | ||||
| 	case 1: | ||||
| 		mlsRange.low = &level{} | ||||
| 		if err := mlsRange.low.parseLevel(levelSlice[0]); err != nil { | ||||
| 			return nil, fmt.Errorf("failed to parse low level %q: %w", levelSlice[0], err) | ||||
| 		r.low = &level{} | ||||
| 		if err := r.low.parseLevel(l[0]); err != nil { | ||||
| 			return nil, fmt.Errorf("failed to parse low level %q: %w", l[0], err) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if mlsRange.high == nil { | ||||
| 		mlsRange.high = mlsRange.low | ||||
| 	if r.high == nil { | ||||
| 		r.high = r.low | ||||
| 	} | ||||
|  | ||||
| 	return mlsRange, nil | ||||
| 	return r, nil | ||||
| } | ||||
|  | ||||
| // bitsetToStr takes a category bitset and returns it in the | ||||
| @@ -616,17 +607,17 @@ func bitsetToStr(c *big.Int) string { | ||||
| 	return str | ||||
| } | ||||
|  | ||||
| func (l1 *level) equal(l2 *level) bool { | ||||
| 	if l2 == nil || l1 == nil { | ||||
| 		return l1 == l2 | ||||
| func (l *level) equal(l2 *level) bool { | ||||
| 	if l2 == nil || l == nil { | ||||
| 		return l == l2 | ||||
| 	} | ||||
| 	if l1.sens != l2.sens { | ||||
| 	if l2.sens != l.sens { | ||||
| 		return false | ||||
| 	} | ||||
| 	if l2.cats == nil || l1.cats == nil { | ||||
| 		return l2.cats == l1.cats | ||||
| 	if l2.cats == nil || l.cats == nil { | ||||
| 		return l2.cats == l.cats | ||||
| 	} | ||||
| 	return l1.cats.Cmp(l2.cats) == 0 | ||||
| 	return l.cats.Cmp(l2.cats) == 0 | ||||
| } | ||||
|  | ||||
| // String returns an mlsRange as a string. | ||||
| @@ -720,36 +711,13 @@ func readWriteCon(fpath string, val string) (string, error) { | ||||
| 	return readConFd(f) | ||||
| } | ||||
|  | ||||
| // setExecLabel sets the SELinux label that the kernel will use for any programs | ||||
| // that are executed by the current process thread, or an error. | ||||
| func setExecLabel(label string) error { | ||||
| 	return writeAttr("exec", label) | ||||
| } | ||||
|  | ||||
| // setTaskLabel sets the SELinux label for the current thread, or an error. | ||||
| // This requires the dyntransition permission. | ||||
| func setTaskLabel(label string) error { | ||||
| 	return writeAttr("current", label) | ||||
| } | ||||
|  | ||||
| // setSocketLabel takes a process label and tells the kernel to assign the | ||||
| // label to the next socket that gets created | ||||
| func setSocketLabel(label string) error { | ||||
| 	return writeAttr("sockcreate", label) | ||||
| } | ||||
|  | ||||
| // socketLabel retrieves the current socket label setting | ||||
| func socketLabel() (string, error) { | ||||
| 	return readAttr("sockcreate") | ||||
| } | ||||
|  | ||||
| // peerLabel retrieves the label of the client on the other side of a socket | ||||
| func peerLabel(fd uintptr) (string, error) { | ||||
| 	label, err := unix.GetsockoptString(int(fd), unix.SOL_SOCKET, unix.SO_PEERSEC) | ||||
| 	l, err := unix.GetsockoptString(int(fd), unix.SOL_SOCKET, unix.SO_PEERSEC) | ||||
| 	if err != nil { | ||||
| 		return "", &os.PathError{Op: "getsockopt", Path: "fd " + strconv.Itoa(int(fd)), Err: err} | ||||
| 	} | ||||
| 	return label, nil | ||||
| 	return l, nil | ||||
| } | ||||
|  | ||||
| // setKeyLabel takes a process label and tells the kernel to assign the | ||||
| @@ -765,15 +733,10 @@ func setKeyLabel(label string) error { | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // keyLabel retrieves the current kernel keyring label setting | ||||
| func keyLabel() (string, error) { | ||||
| 	return readCon("/proc/self/attr/keycreate") | ||||
| } | ||||
|  | ||||
| // get returns the Context as a string | ||||
| func (c Context) get() string { | ||||
| 	if level := c["level"]; level != "" { | ||||
| 		return c["user"] + ":" + c["role"] + ":" + c["type"] + ":" + level | ||||
| 	if l := c["level"]; l != "" { | ||||
| 		return c["user"] + ":" + c["role"] + ":" + c["type"] + ":" + l | ||||
| 	} | ||||
| 	return c["user"] + ":" + c["role"] + ":" + c["type"] | ||||
| } | ||||
| @@ -785,7 +748,7 @@ func newContext(label string) (Context, error) { | ||||
| 	if len(label) != 0 { | ||||
| 		con := strings.SplitN(label, ":", 4) | ||||
| 		if len(con) < 3 { | ||||
| 			return c, InvalidLabel | ||||
| 			return c, ErrInvalidLabel | ||||
| 		} | ||||
| 		c["user"] = con[0] | ||||
| 		c["role"] = con[1] | ||||
| @@ -815,14 +778,23 @@ func reserveLabel(label string) { | ||||
| } | ||||
|  | ||||
| func selinuxEnforcePath() string { | ||||
| 	return path.Join(getSelinuxMountPoint(), "enforce") | ||||
| 	return filepath.Join(getSelinuxMountPoint(), "enforce") | ||||
| } | ||||
|  | ||||
| // isMLSEnabled checks if MLS is enabled. | ||||
| func isMLSEnabled() bool { | ||||
| 	enabledB, err := os.ReadFile(filepath.Join(getSelinuxMountPoint(), "mls")) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 	return bytes.Equal(enabledB, []byte{'1'}) | ||||
| } | ||||
|  | ||||
| // enforceMode returns the current SELinux mode Enforcing, Permissive, Disabled | ||||
| func enforceMode() int { | ||||
| 	var enforce int | ||||
|  | ||||
| 	enforceB, err := ioutil.ReadFile(selinuxEnforcePath()) | ||||
| 	enforceB, err := os.ReadFile(selinuxEnforcePath()) | ||||
| 	if err != nil { | ||||
| 		return -1 | ||||
| 	} | ||||
| @@ -836,11 +808,12 @@ func enforceMode() int { | ||||
| // setEnforceMode sets the current SELinux mode Enforcing, Permissive. | ||||
| // Disabled is not valid, since this needs to be set at boot time. | ||||
| func setEnforceMode(mode int) error { | ||||
| 	return ioutil.WriteFile(selinuxEnforcePath(), []byte(strconv.Itoa(mode)), 0o644) | ||||
| 	//nolint:gosec // ignore G306: permissions to be 0600 or less. | ||||
| 	return os.WriteFile(selinuxEnforcePath(), []byte(strconv.Itoa(mode)), 0o644) | ||||
| } | ||||
|  | ||||
| // defaultEnforceMode returns the systems default SELinux mode Enforcing, | ||||
| // Permissive or Disabled. Note this is is just the default at boot time. | ||||
| // Permissive or Disabled. Note this is just the default at boot time. | ||||
| // EnforceMode tells you the systems current mode. | ||||
| func defaultEnforceMode() int { | ||||
| 	switch readConfig(selinuxTag) { | ||||
| @@ -940,7 +913,7 @@ func openContextFile() (*os.File, error) { | ||||
| 	if f, err := os.Open(contextFile); err == nil { | ||||
| 		return f, nil | ||||
| 	} | ||||
| 	return os.Open(filepath.Join(policyRoot(), "/contexts/lxc_contexts")) | ||||
| 	return os.Open(filepath.Join(policyRoot(), "contexts", "lxc_contexts")) | ||||
| } | ||||
|  | ||||
| func loadLabels() { | ||||
| @@ -1043,7 +1016,8 @@ func addMcs(processLabel, fileLabel string) (string, string) { | ||||
|  | ||||
| // securityCheckContext validates that the SELinux label is understood by the kernel | ||||
| func securityCheckContext(val string) error { | ||||
| 	return ioutil.WriteFile(path.Join(getSelinuxMountPoint(), "context"), []byte(val), 0o644) | ||||
| 	//nolint:gosec // ignore G306: permissions to be 0600 or less. | ||||
| 	return os.WriteFile(filepath.Join(getSelinuxMountPoint(), "context"), []byte(val), 0o644) | ||||
| } | ||||
|  | ||||
| // copyLevel returns a label with the MLS/MCS level from src label replaced on | ||||
| @@ -1072,22 +1046,7 @@ func copyLevel(src, dest string) (string, error) { | ||||
| 	return tcon.Get(), nil | ||||
| } | ||||
|  | ||||
| // Prevent users from relabeling system files | ||||
| func badPrefix(fpath string) error { | ||||
| 	if fpath == "" { | ||||
| 		return ErrEmptyPath | ||||
| 	} | ||||
|  | ||||
| 	badPrefixes := []string{"/usr"} | ||||
| 	for _, prefix := range badPrefixes { | ||||
| 		if strings.HasPrefix(fpath, prefix) { | ||||
| 			return fmt.Errorf("relabeling content in %s is not allowed", prefix) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // chcon changes the fpath file object to the SELinux label label. | ||||
| // chcon changes the fpath file object to the SELinux label. | ||||
| // If fpath is a directory and recurse is true, then chcon walks the | ||||
| // directory tree setting the label. | ||||
| func chcon(fpath string, label string, recurse bool) error { | ||||
| @@ -1097,17 +1056,97 @@ func chcon(fpath string, label string, recurse bool) error { | ||||
| 	if label == "" { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if err := badPrefix(fpath); err != nil { | ||||
| 		return err | ||||
|  | ||||
| 	excludePaths := map[string]bool{ | ||||
| 		"/":           true, | ||||
| 		"/bin":        true, | ||||
| 		"/boot":       true, | ||||
| 		"/dev":        true, | ||||
| 		"/etc":        true, | ||||
| 		"/etc/passwd": true, | ||||
| 		"/etc/pki":    true, | ||||
| 		"/etc/shadow": true, | ||||
| 		"/home":       true, | ||||
| 		"/lib":        true, | ||||
| 		"/lib64":      true, | ||||
| 		"/media":      true, | ||||
| 		"/opt":        true, | ||||
| 		"/proc":       true, | ||||
| 		"/root":       true, | ||||
| 		"/run":        true, | ||||
| 		"/sbin":       true, | ||||
| 		"/srv":        true, | ||||
| 		"/sys":        true, | ||||
| 		"/tmp":        true, | ||||
| 		"/usr":        true, | ||||
| 		"/var":        true, | ||||
| 		"/var/lib":    true, | ||||
| 		"/var/log":    true, | ||||
| 	} | ||||
|  | ||||
| 	if home := os.Getenv("HOME"); home != "" { | ||||
| 		excludePaths[home] = true | ||||
| 	} | ||||
|  | ||||
| 	if sudoUser := os.Getenv("SUDO_USER"); sudoUser != "" { | ||||
| 		if usr, err := user.Lookup(sudoUser); err == nil { | ||||
| 			excludePaths[usr.HomeDir] = true | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if fpath != "/" { | ||||
| 		fpath = strings.TrimSuffix(fpath, "/") | ||||
| 	} | ||||
| 	if excludePaths[fpath] { | ||||
| 		return fmt.Errorf("SELinux relabeling of %s is not allowed", fpath) | ||||
| 	} | ||||
|  | ||||
| 	if !recurse { | ||||
| 		return setFileLabel(fpath, label) | ||||
| 		err := lSetFileLabel(fpath, label) | ||||
| 		if err != nil { | ||||
| 			// Check if file doesn't exist, must have been removed | ||||
| 			if errors.Is(err, os.ErrNotExist) { | ||||
| 				return nil | ||||
| 			} | ||||
| 			// Check if current label is correct on disk | ||||
| 			flabel, nerr := lFileLabel(fpath) | ||||
| 			if nerr == nil && flabel == label { | ||||
| 				return nil | ||||
| 			} | ||||
| 			// Check if file doesn't exist, must have been removed | ||||
| 			if errors.Is(nerr, os.ErrNotExist) { | ||||
| 				return nil | ||||
| 			} | ||||
| 			return err | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	return rchcon(fpath, label) | ||||
| } | ||||
|  | ||||
| func rchcon(fpath, label string) error { //revive:disable:cognitive-complexity | ||||
| 	fastMode := false | ||||
| 	// If the current label matches the new label, assume | ||||
| 	// other labels are correct. | ||||
| 	if cLabel, err := lFileLabel(fpath); err == nil && cLabel == label { | ||||
| 		fastMode = true | ||||
| 	} | ||||
| 	return pwalkdir.Walk(fpath, func(p string, _ fs.DirEntry, _ error) error { | ||||
| 		if fastMode { | ||||
| 			if cLabel, err := lFileLabel(fpath); err == nil && cLabel == label { | ||||
| 				return nil | ||||
| 			} | ||||
| 		} | ||||
| 		err := lSetFileLabel(p, label) | ||||
| 		// Walk a file tree can race with removal, so ignore ENOENT. | ||||
| 		if errors.Is(err, os.ErrNotExist) { | ||||
| 			return nil | ||||
| 		} | ||||
| 		return err | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // dupSecOpt takes an SELinux process label and returns security options that | ||||
| // can be used to set the SELinux Type and Level for future container processes. | ||||
| func dupSecOpt(src string) ([]string, error) { | ||||
| @@ -1136,12 +1175,6 @@ func dupSecOpt(src string) ([]string, error) { | ||||
| 	return dup, nil | ||||
| } | ||||
|  | ||||
| // disableSecOpt returns a security opt that can be used to disable SELinux | ||||
| // labeling support for future container processes. | ||||
| func disableSecOpt() []string { | ||||
| 	return []string{"disable"} | ||||
| } | ||||
|  | ||||
| // findUserInContext scans the reader for a valid SELinux context | ||||
| // match that is verified with the verifier. Invalid contexts are | ||||
| // skipped. It returns a matched context or an empty string if no | ||||
|   | ||||
							
								
								
									
										45
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,10 +1,22 @@ | ||||
| //go:build !linux | ||||
| // +build !linux | ||||
|  | ||||
| package selinux | ||||
|  | ||||
| func setDisabled() { | ||||
| func attrPath(string) string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func readCon(fpath string) (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| func writeCon(string, string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func setDisabled() {} | ||||
|  | ||||
| func getEnabled() bool { | ||||
| 	return false | ||||
| } | ||||
| @@ -61,22 +73,6 @@ func calculateGlbLub(sourceRange, targetRange string) (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| func setExecLabel(label string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func setTaskLabel(label string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func setSocketLabel(label string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func socketLabel() (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| func peerLabel(fd uintptr) (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
| @@ -85,17 +81,12 @@ func setKeyLabel(label string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func keyLabel() (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| func (c Context) get() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| func newContext(label string) (Context, error) { | ||||
| 	c := make(Context) | ||||
| 	return c, nil | ||||
| 	return Context{}, nil | ||||
| } | ||||
|  | ||||
| func clearLabels() { | ||||
| @@ -104,6 +95,10 @@ func clearLabels() { | ||||
| func reserveLabel(label string) { | ||||
| } | ||||
|  | ||||
| func isMLSEnabled() bool { | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| func enforceMode() int { | ||||
| 	return Disabled | ||||
| } | ||||
| @@ -151,10 +146,6 @@ func dupSecOpt(src string) ([]string, error) { | ||||
| 	return nil, nil | ||||
| } | ||||
|  | ||||
| func disableSecOpt() []string { | ||||
| 	return []string{"disable"} | ||||
| } | ||||
|  | ||||
| func getDefaultContextWithLevel(user, level, scon string) (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										48
									
								
								vendor/github.com/opencontainers/selinux/pkg/pwalk/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								vendor/github.com/opencontainers/selinux/pkg/pwalk/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,48 +0,0 @@ | ||||
| ## pwalk: parallel implementation of filepath.Walk | ||||
|  | ||||
| This is a wrapper for [filepath.Walk](https://pkg.go.dev/path/filepath?tab=doc#Walk) | ||||
| which may speed it up by calling multiple callback functions (WalkFunc) in parallel, | ||||
| utilizing goroutines. | ||||
|  | ||||
| By default, it utilizes 2\*runtime.NumCPU() goroutines for callbacks. | ||||
| This can be changed by using WalkN function which has the additional | ||||
| parameter, specifying the number of goroutines (concurrency). | ||||
|  | ||||
| ### pwalk vs pwalkdir | ||||
|  | ||||
| This package is deprecated in favor of | ||||
| [pwalkdir](https://pkg.go.dev/github.com/opencontainers/selinux/pkg/pwalkdir), | ||||
| which is faster, but requires at least Go 1.16. | ||||
|  | ||||
| ### Caveats | ||||
|  | ||||
| Please note the following limitations of this code: | ||||
|  | ||||
| * Unlike filepath.Walk, the order of calls is non-deterministic; | ||||
|  | ||||
| * Only primitive error handling is supported: | ||||
|  | ||||
|   * filepath.SkipDir is not supported; | ||||
|  | ||||
|   * no errors are ever passed to WalkFunc; | ||||
|  | ||||
|   * once any error is returned from any WalkFunc instance, no more new calls | ||||
|     to WalkFunc are made, and the error is returned to the caller of Walk; | ||||
|  | ||||
|   * if more than one walkFunc instance will return an error, only one | ||||
|     of such errors will be propagated and returned by Walk, others | ||||
|     will be silently discarded. | ||||
|  | ||||
| ### Documentation | ||||
|  | ||||
| For the official documentation, see | ||||
| https://pkg.go.dev/github.com/opencontainers/selinux/pkg/pwalk?tab=doc | ||||
|  | ||||
| ### Benchmarks | ||||
|  | ||||
| For a WalkFunc that consists solely of the return statement, this | ||||
| implementation is about 10% slower than the standard library's | ||||
| filepath.Walk. | ||||
|  | ||||
| Otherwise (if a WalkFunc is doing something) this is usually faster, | ||||
| except when the WalkN(..., 1) is used. | ||||
							
								
								
									
										115
									
								
								vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										115
									
								
								vendor/github.com/opencontainers/selinux/pkg/pwalk/pwalk.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,115 +0,0 @@ | ||||
| package pwalk | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 	"runtime" | ||||
| 	"sync" | ||||
| ) | ||||
|  | ||||
| type WalkFunc = filepath.WalkFunc | ||||
|  | ||||
| // Walk is a wrapper for filepath.Walk which can call multiple walkFn | ||||
| // in parallel, allowing to handle each item concurrently. A maximum of | ||||
| // twice the runtime.NumCPU() walkFn will be called at any one time. | ||||
| // If you want to change the maximum, use WalkN instead. | ||||
| // | ||||
| // The order of calls is non-deterministic. | ||||
| // | ||||
| // Note that this implementation only supports primitive error handling: | ||||
| // | ||||
| // - no errors are ever passed to walkFn; | ||||
| // | ||||
| // - once a walkFn returns any error, all further processing stops | ||||
| // and the error is returned to the caller of Walk; | ||||
| // | ||||
| // - filepath.SkipDir is not supported; | ||||
| // | ||||
| // - if more than one walkFn instance will return an error, only one | ||||
| // of such errors will be propagated and returned by Walk, others | ||||
| // will be silently discarded. | ||||
| func Walk(root string, walkFn WalkFunc) error { | ||||
| 	return WalkN(root, walkFn, runtime.NumCPU()*2) | ||||
| } | ||||
|  | ||||
| // WalkN is a wrapper for filepath.Walk which can call multiple walkFn | ||||
| // in parallel, allowing to handle each item concurrently. A maximum of | ||||
| // num walkFn will be called at any one time. | ||||
| // | ||||
| // Please see Walk documentation for caveats of using this function. | ||||
| func WalkN(root string, walkFn WalkFunc, num int) error { | ||||
| 	// make sure limit is sensible | ||||
| 	if num < 1 { | ||||
| 		return fmt.Errorf("walk(%q): num must be > 0", root) | ||||
| 	} | ||||
|  | ||||
| 	files := make(chan *walkArgs, 2*num) | ||||
| 	errCh := make(chan error, 1) // get the first error, ignore others | ||||
|  | ||||
| 	// Start walking a tree asap | ||||
| 	var ( | ||||
| 		err error | ||||
| 		wg  sync.WaitGroup | ||||
|  | ||||
| 		rootLen   = len(root) | ||||
| 		rootEntry *walkArgs | ||||
| 	) | ||||
| 	wg.Add(1) | ||||
| 	go func() { | ||||
| 		err = filepath.Walk(root, func(p string, info os.FileInfo, err error) error { | ||||
| 			if err != nil { | ||||
| 				close(files) | ||||
| 				return err | ||||
| 			} | ||||
| 			if len(p) == rootLen { | ||||
| 				// Root entry is processed separately below. | ||||
| 				rootEntry = &walkArgs{path: p, info: &info} | ||||
| 				return nil | ||||
| 			} | ||||
| 			// add a file to the queue unless a callback sent an error | ||||
| 			select { | ||||
| 			case e := <-errCh: | ||||
| 				close(files) | ||||
| 				return e | ||||
| 			default: | ||||
| 				files <- &walkArgs{path: p, info: &info} | ||||
| 				return nil | ||||
| 			} | ||||
| 		}) | ||||
| 		if err == nil { | ||||
| 			close(files) | ||||
| 		} | ||||
| 		wg.Done() | ||||
| 	}() | ||||
|  | ||||
| 	wg.Add(num) | ||||
| 	for i := 0; i < num; i++ { | ||||
| 		go func() { | ||||
| 			for file := range files { | ||||
| 				if e := walkFn(file.path, *file.info, nil); e != nil { | ||||
| 					select { | ||||
| 					case errCh <- e: // sent ok | ||||
| 					default: // buffer full | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			wg.Done() | ||||
| 		}() | ||||
| 	} | ||||
|  | ||||
| 	wg.Wait() | ||||
|  | ||||
| 	if err == nil { | ||||
| 		err = walkFn(rootEntry.path, *rootEntry.info, nil) | ||||
| 	} | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| // walkArgs holds the arguments that were passed to the Walk or WalkN | ||||
| // functions. | ||||
| type walkArgs struct { | ||||
| 	path string | ||||
| 	info *os.FileInfo | ||||
| } | ||||
							
								
								
									
										2
									
								
								vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/opencontainers/selinux/pkg/pwalkdir/pwalkdir.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -111,6 +111,6 @@ func WalkN(root string, walkFn fs.WalkDirFunc, num int) error { | ||||
| // walkArgs holds the arguments that were passed to the Walk or WalkN | ||||
| // functions. | ||||
| type walkArgs struct { | ||||
| 	path  string | ||||
| 	entry fs.DirEntry | ||||
| 	path  string | ||||
| } | ||||
|   | ||||
							
								
								
									
										5
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -594,11 +594,10 @@ github.com/opencontainers/runc/types | ||||
| # github.com/opencontainers/runtime-spec v1.0.3-0.20220909204839-494a5a6aca78 | ||||
| ## explicit | ||||
| github.com/opencontainers/runtime-spec/specs-go | ||||
| # github.com/opencontainers/selinux v1.10.0 | ||||
| ## explicit; go 1.13 | ||||
| # github.com/opencontainers/selinux v1.11.0 | ||||
| ## explicit; go 1.19 | ||||
| github.com/opencontainers/selinux/go-selinux | ||||
| github.com/opencontainers/selinux/go-selinux/label | ||||
| github.com/opencontainers/selinux/pkg/pwalk | ||||
| github.com/opencontainers/selinux/pkg/pwalkdir | ||||
| # github.com/peterbourgon/diskv v2.0.1+incompatible | ||||
| ## explicit | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Akhil Mohan
					Akhil Mohan