From 4c5cea92587c786d6790ea7f699eb3d0726ece29 Mon Sep 17 00:00:00 2001 From: Lantao Liu Date: Mon, 7 Aug 2017 22:25:26 +0000 Subject: [PATCH] Handle device symlink. Signed-off-by: Lantao Liu --- pkg/server/container_create.go | 10 +++++++++- pkg/server/helpers.go | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/pkg/server/container_create.go b/pkg/server/container_create.go index 8a83efa49..26cff1103 100644 --- a/pkg/server/container_create.go +++ b/pkg/server/container_create.go @@ -341,6 +341,10 @@ func addOCIDevices(g *generate.Generator, devs []*runtime.Device, privileged boo UID: &hostDevice.Uid, GID: &hostDevice.Gid, } + if hostDevice.Major == 0 && hostDevice.Minor == 0 { + // Invalid device, most likely a symbolic link, skip it. + continue + } g.AddDevice(rd) } spec.Linux.Resources.Devices = []runtimespec.LinuxDeviceCgroup{ @@ -352,7 +356,11 @@ func addOCIDevices(g *generate.Generator, devs []*runtime.Device, privileged boo return nil } for _, device := range devs { - dev, err := devices.DeviceFromPath(device.HostPath, device.Permissions) + path, err := resolveSymbolicLink(device.HostPath) + if err != nil { + return err + } + dev, err := devices.DeviceFromPath(path, device.Permissions) if err != nil { return err } diff --git a/pkg/server/helpers.go b/pkg/server/helpers.go index 4a08d58a7..2f112355f 100644 --- a/pkg/server/helpers.go +++ b/pkg/server/helpers.go @@ -20,6 +20,7 @@ import ( "encoding/json" "fmt" "io" + "os" "path/filepath" "strconv" "strings" @@ -402,3 +403,16 @@ func (c *criContainerdService) ensureImageExists(ctx context.Context, ref string } return &newImage, nil } + +// resolveSymbolicLink resolves a possbile symlink path. If the path is a symlink, returns resolved +// path; if not, returns the original path. +func resolveSymbolicLink(path string) (string, error) { + info, err := os.Lstat(path) + if err != nil { + return "", err + } + if info.Mode()&os.ModeSymlink != os.ModeSymlink { + return path, nil + } + return filepath.EvalSymlinks(path) +}