summaryrefslogtreecommitdiffhomepage
path: root/runsc/boot/fs.go
diff options
context:
space:
mode:
Diffstat (limited to 'runsc/boot/fs.go')
-rw-r--r--runsc/boot/fs.go58
1 files changed, 2 insertions, 56 deletions
diff --git a/runsc/boot/fs.go b/runsc/boot/fs.go
index 3df276170..5ec9a7d03 100644
--- a/runsc/boot/fs.go
+++ b/runsc/boot/fs.go
@@ -16,7 +16,6 @@ package boot
import (
"fmt"
- "path"
"path/filepath"
"strconv"
"strings"
@@ -683,64 +682,11 @@ func setFileSystemForProcess(procArgs *kernel.CreateProcessArgs, spec *specs.Spe
return nil
}
-// getExecutablePath traverses the *container's* filesystem to resolve exec's
-// absolute path. For example, if the container is being served files by the
-// fsgofer serving /foo/bar as the container root, it will search within
-// /foo/bar, not the host root.
-// TODO: Unit test this.
-func getExecutablePath(ctx context.Context, mns *fs.MountNamespace, filename string, env []string) (string, error) {
- exec := filepath.Clean(filename)
-
- // Don't search PATH if exec is a path to a file (absolute or relative).
- if strings.IndexByte(exec, '/') >= 0 {
- return exec, nil
- }
-
- // Search the PATH for a file whose name matches the one we are looking
- // for.
- pathDirs := specutils.GetPath(env)
- for _, p := range pathDirs {
- // Try to find the binary inside path p.
- binPath := path.Join(p, filename)
- root := fs.RootFromContext(ctx)
- defer root.DecRef()
- d, err := mns.FindInode(ctx, root, nil, binPath, linux.MaxSymlinkTraversals)
- if err == syserror.ENOENT || err == syserror.EACCES {
- continue
- }
- if err != nil {
- return "", fmt.Errorf("FindInode(%q) failed: %v", binPath, err)
- }
- defer d.DecRef()
-
- // Check whether we can read and execute the found file.
- if err := d.Inode.CheckPermission(ctx, fs.PermMask{Read: true, Execute: true}); err != nil {
- log.Infof("Found executable at %q, but user cannot execute it: %v", binPath, err)
- continue
- }
- return path.Join("/", p, exec), nil
- }
-
- return "", fmt.Errorf("could not find executable %q in path %v", exec, pathDirs)
-}
-
// setExecutablePath sets the procArgs.Filename by searching the PATH for an
// executable matching the procArgs.Argv[0].
func setExecutablePath(ctx context.Context, mns *fs.MountNamespace, procArgs *kernel.CreateProcessArgs) error {
- if procArgs.Filename != "" {
- // Sanity check.
- if !path.IsAbs(procArgs.Filename) {
- return fmt.Errorf("filename must be absolute: %q", procArgs.Filename)
- }
- // Nothing to set.
- return nil
- }
-
- if len(procArgs.Argv) == 0 {
- return fmt.Errorf("Argv must not be empty")
- }
-
- f, err := getExecutablePath(ctx, mns, procArgs.Argv[0], procArgs.Envv)
+ paths := fs.GetPath(procArgs.Envv)
+ f, err := mns.ResolveExecutablePath(ctx, procArgs.WorkingDirectory, procArgs.Argv[0], paths)
if err != nil {
return err
}