mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 05:40:42 +00:00 
			
		
		
		
	Bump Libcontainer to latest head
This commit is contained in:
		
							
								
								
									
										79
									
								
								vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										79
									
								
								vendor/github.com/opencontainers/runc/libcontainer/rootfs_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -25,10 +25,10 @@ import ( | ||||
|  | ||||
| const defaultMountFlags = syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV | ||||
|  | ||||
| // setupDev returns true if /dev needs to be set up. | ||||
| // needsSetupDev returns true if /dev needs to be set up. | ||||
| func needsSetupDev(config *configs.Config) bool { | ||||
| 	for _, m := range config.Mounts { | ||||
| 		if m.Device == "bind" && (m.Destination == "/dev" || m.Destination == "/dev/") { | ||||
| 		if m.Device == "bind" && libcontainerUtils.CleanPath(m.Destination) == "/dev" { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| @@ -39,35 +39,35 @@ func needsSetupDev(config *configs.Config) bool { | ||||
| // new mount namespace. | ||||
| func setupRootfs(config *configs.Config, console *linuxConsole, pipe io.ReadWriter) (err error) { | ||||
| 	if err := prepareRoot(config); err != nil { | ||||
| 		return newSystemError(err) | ||||
| 		return newSystemErrorWithCause(err, "preparing rootfs") | ||||
| 	} | ||||
|  | ||||
| 	setupDev := needsSetupDev(config) | ||||
| 	for _, m := range config.Mounts { | ||||
| 		for _, precmd := range m.PremountCmds { | ||||
| 			if err := mountCmd(precmd); err != nil { | ||||
| 				return newSystemError(err) | ||||
| 				return newSystemErrorWithCause(err, "running premount command") | ||||
| 			} | ||||
| 		} | ||||
| 		if err := mountToRootfs(m, config.Rootfs, config.MountLabel); err != nil { | ||||
| 			return newSystemError(err) | ||||
| 			return newSystemErrorWithCausef(err, "mounting %q to rootfs %q", m.Destination, config.Rootfs) | ||||
| 		} | ||||
|  | ||||
| 		for _, postcmd := range m.PostmountCmds { | ||||
| 			if err := mountCmd(postcmd); err != nil { | ||||
| 				return newSystemError(err) | ||||
| 				return newSystemErrorWithCause(err, "running postmount command") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if setupDev { | ||||
| 		if err := createDevices(config); err != nil { | ||||
| 			return newSystemError(err) | ||||
| 			return newSystemErrorWithCause(err, "creating device nodes") | ||||
| 		} | ||||
| 		if err := setupPtmx(config, console); err != nil { | ||||
| 			return newSystemError(err) | ||||
| 			return newSystemErrorWithCause(err, "setting up ptmx") | ||||
| 		} | ||||
| 		if err := setupDevSymlinks(config.Rootfs); err != nil { | ||||
| 			return newSystemError(err) | ||||
| 			return newSystemErrorWithCause(err, "setting up /dev symlinks") | ||||
| 		} | ||||
| 	} | ||||
| 	// Signal the parent to run the pre-start hooks. | ||||
| @@ -78,7 +78,7 @@ func setupRootfs(config *configs.Config, console *linuxConsole, pipe io.ReadWrit | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := syscall.Chdir(config.Rootfs); err != nil { | ||||
| 		return newSystemError(err) | ||||
| 		return newSystemErrorWithCausef(err, "changing dir to %q", config.Rootfs) | ||||
| 	} | ||||
| 	if config.NoPivotRoot { | ||||
| 		err = msMoveRoot(config.Rootfs) | ||||
| @@ -86,19 +86,19 @@ func setupRootfs(config *configs.Config, console *linuxConsole, pipe io.ReadWrit | ||||
| 		err = pivotRoot(config.Rootfs, config.PivotDir) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return newSystemError(err) | ||||
| 		return newSystemErrorWithCause(err, "jailing process inside rootfs") | ||||
| 	} | ||||
| 	if setupDev { | ||||
| 		if err := reOpenDevNull(); err != nil { | ||||
| 			return newSystemError(err) | ||||
| 			return newSystemErrorWithCause(err, "reopening /dev/null inside container") | ||||
| 		} | ||||
| 	} | ||||
| 	// remount dev as ro if specifed | ||||
| 	for _, m := range config.Mounts { | ||||
| 		if m.Destination == "/dev" { | ||||
| 		if libcontainerUtils.CleanPath(m.Destination) == "/dev" { | ||||
| 			if m.Flags&syscall.MS_RDONLY != 0 { | ||||
| 				if err := remountReadonly(m.Destination); err != nil { | ||||
| 					return newSystemError(err) | ||||
| 					return newSystemErrorWithCausef(err, "remounting %q as readonly", m.Destination) | ||||
| 				} | ||||
| 			} | ||||
| 			break | ||||
| @@ -107,7 +107,7 @@ func setupRootfs(config *configs.Config, console *linuxConsole, pipe io.ReadWrit | ||||
| 	// set rootfs ( / ) as readonly | ||||
| 	if config.Readonlyfs { | ||||
| 		if err := setReadonly(); err != nil { | ||||
| 			return newSystemError(err) | ||||
| 			return newSystemErrorWithCause(err, "setting rootfs as readonly") | ||||
| 		} | ||||
| 	} | ||||
| 	syscall.Umask(0022) | ||||
| @@ -115,14 +115,12 @@ func setupRootfs(config *configs.Config, console *linuxConsole, pipe io.ReadWrit | ||||
| } | ||||
|  | ||||
| func mountCmd(cmd configs.Command) error { | ||||
|  | ||||
| 	command := exec.Command(cmd.Path, cmd.Args[:]...) | ||||
| 	command.Env = cmd.Env | ||||
| 	command.Dir = cmd.Dir | ||||
| 	if out, err := command.CombinedOutput(); err != nil { | ||||
| 		return fmt.Errorf("%#v failed: %s: %v", cmd, string(out), err) | ||||
| 	} | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -240,34 +238,23 @@ func mountToRootfs(m *configs.Mount, rootfs, mountLabel string) error { | ||||
| 				return err | ||||
| 			} | ||||
| 		} | ||||
| 		// create symlinks for merged cgroups | ||||
| 		cwd, err := os.Getwd() | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if err := os.Chdir(filepath.Join(rootfs, m.Destination)); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		for _, mc := range merged { | ||||
| 			for _, ss := range strings.Split(mc, ",") { | ||||
| 				if err := os.Symlink(mc, ss); err != nil { | ||||
| 					// if cgroup already exists, then okay(it could have been created before) | ||||
| 					if os.IsExist(err) { | ||||
| 						continue | ||||
| 					} | ||||
| 					os.Chdir(cwd) | ||||
| 				// symlink(2) is very dumb, it will just shove the path into | ||||
| 				// the link and doesn't do any checks or relative path | ||||
| 				// conversion. Also, don't error out if the cgroup already exists. | ||||
| 				if err := os.Symlink(mc, filepath.Join(rootfs, m.Destination, ss)); err != nil && !os.IsExist(err) { | ||||
| 					return err | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		if err := os.Chdir(cwd); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		if m.Flags&syscall.MS_RDONLY != 0 { | ||||
| 			// remount cgroup root as readonly | ||||
| 			mcgrouproot := &configs.Mount{ | ||||
| 				Source:      m.Destination, | ||||
| 				Device:      "bind", | ||||
| 				Destination: m.Destination, | ||||
| 				Flags:       defaultMountFlags | syscall.MS_RDONLY, | ||||
| 				Flags:       defaultMountFlags | syscall.MS_RDONLY | syscall.MS_BIND, | ||||
| 			} | ||||
| 			if err := remount(mcgrouproot, rootfs); err != nil { | ||||
| 				return err | ||||
| @@ -515,10 +502,10 @@ func getParentMount(rootfs string) (string, string, error) { | ||||
| } | ||||
|  | ||||
| // Make parent mount private if it was shared | ||||
| func rootfsParentMountPrivate(config *configs.Config) error { | ||||
| func rootfsParentMountPrivate(rootfs string) error { | ||||
| 	sharedMount := false | ||||
|  | ||||
| 	parentMount, optionalOpts, err := getParentMount(config.Rootfs) | ||||
| 	parentMount, optionalOpts, err := getParentMount(rootfs) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -550,9 +537,10 @@ func prepareRoot(config *configs.Config) error { | ||||
| 	if err := syscall.Mount("", "/", "", uintptr(flag), ""); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	if err := rootfsParentMountPrivate(config); err != nil { | ||||
| 		return err | ||||
| 	if config.NoPivotRoot { | ||||
| 		if err := rootfsParentMountPrivate(config.Rootfs); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return syscall.Mount(config.Rootfs, config.Rootfs, "bind", syscall.MS_BIND|syscall.MS_REC, "") | ||||
| @@ -595,7 +583,14 @@ func pivotRoot(rootfs, pivotBaseDir string) (err error) { | ||||
| 		} | ||||
| 	}() | ||||
| 	if err := syscall.PivotRoot(rootfs, pivotDir); err != nil { | ||||
| 		return fmt.Errorf("pivot_root %s", err) | ||||
| 		// Make the parent mount private | ||||
| 		if err := rootfsParentMountPrivate(rootfs); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		// Try again | ||||
| 		if err := syscall.PivotRoot(rootfs, pivotDir); err != nil { | ||||
| 			return fmt.Errorf("pivot_root %s", err) | ||||
| 		} | ||||
| 	} | ||||
| 	if err := syscall.Chdir("/"); err != nil { | ||||
| 		return fmt.Errorf("chdir / %s", err) | ||||
| @@ -705,7 +700,7 @@ func mountPropagate(m *configs.Mount, rootfs string, mountLabel string) error { | ||||
| 		data  = label.FormatMountLabel(m.Data, mountLabel) | ||||
| 		flags = m.Flags | ||||
| 	) | ||||
| 	if dest == "/dev" { | ||||
| 	if libcontainerUtils.CleanPath(dest) == "/dev" { | ||||
| 		flags &= ^syscall.MS_RDONLY | ||||
| 	} | ||||
| 	if !strings.HasPrefix(dest, rootfs) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user