Merge pull request #3978 from dims/sync-with-latest-containerd-cri-master-including-selinux-change
Sync with latest changes in containerd/cri
This commit is contained in:
		
							
								
								
									
										18
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/label/label_selinux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -13,11 +13,12 @@ import ( | ||||
|  | ||||
| // Valid Label Options | ||||
| var validOptions = map[string]bool{ | ||||
| 	"disable": true, | ||||
| 	"type":    true, | ||||
| 	"user":    true, | ||||
| 	"role":    true, | ||||
| 	"level":   true, | ||||
| 	"disable":  true, | ||||
| 	"type":     true, | ||||
| 	"filetype": true, | ||||
| 	"user":     true, | ||||
| 	"role":     true, | ||||
| 	"level":    true, | ||||
| } | ||||
|  | ||||
| var ErrIncompatibleLabel = fmt.Errorf("Bad SELinux option z and Z can not be used together") | ||||
| @@ -51,13 +52,16 @@ func InitLabels(options []string) (plabel string, mlabel string, Err error) { | ||||
| 				return "", mountLabel, nil | ||||
| 			} | ||||
| 			if i := strings.Index(opt, ":"); i == -1 { | ||||
| 				return "", "", fmt.Errorf("Bad label option %q, valid options 'disable' or \n'user, role, level, type' followed by ':' and a value", opt) | ||||
| 				return "", "", fmt.Errorf("Bad label option %q, valid options 'disable' or \n'user, role, level, type, filetype' followed by ':' and a value", opt) | ||||
| 			} | ||||
| 			con := strings.SplitN(opt, ":", 2) | ||||
| 			if !validOptions[con[0]] { | ||||
| 				return "", "", fmt.Errorf("Bad label option %q, valid options 'disable, user, role, level, type'", con[0]) | ||||
| 				return "", "", fmt.Errorf("Bad label option %q, valid options 'disable, user, role, level, type, filetype'", con[0]) | ||||
|  | ||||
| 			} | ||||
| 			if con[0] == "filetype" { | ||||
| 				mcon["type"] = con[1] | ||||
| 			} | ||||
| 			pcon[con[0]] = con[1] | ||||
| 			if con[0] == "level" || con[0] == "user" { | ||||
| 				mcon[con[0]] = con[1] | ||||
|   | ||||
							
								
								
									
										33
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										33
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,6 +18,8 @@ import ( | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| @@ -252,6 +254,12 @@ func getSELinuxPolicyRoot() string { | ||||
| 	return filepath.Join(selinuxDir, readConfig(selinuxTypeTag)) | ||||
| } | ||||
|  | ||||
| func isProcHandle(fh *os.File) (bool, error) { | ||||
| 	var buf unix.Statfs_t | ||||
| 	err := unix.Fstatfs(int(fh.Fd()), &buf) | ||||
| 	return buf.Type == unix.PROC_SUPER_MAGIC, err | ||||
| } | ||||
|  | ||||
| func readCon(fpath string) (string, error) { | ||||
| 	if fpath == "" { | ||||
| 		return "", ErrEmptyPath | ||||
| @@ -263,6 +271,12 @@ func readCon(fpath string) (string, error) { | ||||
| 	} | ||||
| 	defer in.Close() | ||||
|  | ||||
| 	if ok, err := isProcHandle(in); err != nil { | ||||
| 		return "", err | ||||
| 	} else if !ok { | ||||
| 		return "", fmt.Errorf("%s not on procfs", fpath) | ||||
| 	} | ||||
|  | ||||
| 	var retval string | ||||
| 	if _, err := fmt.Fscanf(in, "%s", &retval); err != nil { | ||||
| 		return "", err | ||||
| @@ -345,6 +359,12 @@ func writeCon(fpath string, val string) error { | ||||
| 	} | ||||
| 	defer out.Close() | ||||
|  | ||||
| 	if ok, err := isProcHandle(out); err != nil { | ||||
| 		return err | ||||
| 	} else if !ok { | ||||
| 		return fmt.Errorf("%s not on procfs", fpath) | ||||
| 	} | ||||
|  | ||||
| 	if val != "" { | ||||
| 		_, err = out.Write([]byte(val)) | ||||
| 	} else { | ||||
| @@ -392,6 +412,14 @@ func SetExecLabel(label string) error { | ||||
| 	return writeCon(fmt.Sprintf("/proc/self/task/%d/attr/exec", syscall.Gettid()), label) | ||||
| } | ||||
|  | ||||
| /* | ||||
| SetTaskLabel sets the SELinux label for the current thread, or an error. | ||||
| This requires the dyntransition permission. | ||||
| */ | ||||
| func SetTaskLabel(label string) error { | ||||
| 	return writeCon(fmt.Sprintf("/proc/self/task/%d/attr/current", syscall.Gettid()), 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 { | ||||
| @@ -403,6 +431,11 @@ func SocketLabel() (string, error) { | ||||
| 	return readCon(fmt.Sprintf("/proc/self/task/%d/attr/sockcreate", syscall.Gettid())) | ||||
| } | ||||
|  | ||||
| // PeerLabel retrieves the label of the client on the other side of a socket | ||||
| func PeerLabel(fd uintptr) (string, error) { | ||||
| 	return unix.GetsockoptString(int(fd), syscall.SOL_SOCKET, syscall.SO_PEERSEC) | ||||
| } | ||||
|  | ||||
| // SetKeyLabel takes a process label and tells the kernel to assign the | ||||
| // label to the next kernel keyring that gets created | ||||
| func SetKeyLabel(label string) error { | ||||
|   | ||||
							
								
								
									
										13
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/opencontainers/selinux/go-selinux/selinux_stub.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -96,6 +96,14 @@ func SetExecLabel(label string) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| /* | ||||
| SetTaskLabel sets the SELinux label for the current thread, or an error. | ||||
| This requires the dyntransition permission. | ||||
| */ | ||||
| func SetTaskLabel(label string) error { | ||||
|         return nil | ||||
| } | ||||
|  | ||||
| /* | ||||
| SetSocketLabel sets the SELinux label that the kernel will use for any programs | ||||
| that are executed by the current process thread, or an error. | ||||
| @@ -109,6 +117,11 @@ func SocketLabel() (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| // PeerLabel retrieves the label of the client on the other side of a socket | ||||
| func PeerLabel(fd uintptr) (string, error) { | ||||
| 	return "", nil | ||||
| } | ||||
|  | ||||
| // SetKeyLabel takes a process label and tells the kernel to assign the | ||||
| // label to the next kernel keyring that gets created | ||||
| func SetKeyLabel(label string) error { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Phil Estes
					Phil Estes