diff options
author | Giuseppe Scrivano <gscrivan@redhat.com> | 2018-10-09 10:48:28 +0200 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2018-10-14 16:57:30 +0200 |
commit | 6dd6ce1ebcdb17023f09fad93698d09408227385 (patch) | |
tree | 7eaf26aff02dc9da3259511f1967d80ed0eaf855 | |
parent | 2ad6012ea1943cb045ebc1a7071c9a9a61538d11 (diff) | |
download | podman-6dd6ce1ebcdb17023f09fad93698d09408227385.tar.gz podman-6dd6ce1ebcdb17023f09fad93698d09408227385.tar.bz2 podman-6dd6ce1ebcdb17023f09fad93698d09408227385.zip |
volume: resolve symlinks in paths
ensure the volume paths are resolved in the mountpoint scope.
Otherwise we might end up using host paths.
Closes: https://github.com/containers/libpod/issues/1608
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
-rw-r--r-- | libpod/container_internal.go | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libpod/container_internal.go b/libpod/container_internal.go index 0a17996d6..9291d72c1 100644 --- a/libpod/container_internal.go +++ b/libpod/container_internal.go @@ -13,6 +13,7 @@ import ( "strings" "syscall" + "github.com/containers/buildah/imagebuildah" "github.com/containers/libpod/pkg/chrootuser" "github.com/containers/libpod/pkg/hooks" "github.com/containers/libpod/pkg/hooks/exec" @@ -1193,8 +1194,6 @@ func (c *Container) addLocalVolumes(ctx context.Context, g *generate.Generator) continue } volumePath := filepath.Join(c.config.StaticDir, "volumes", k) - srcPath := filepath.Join(mountPoint, k) - var ( uid uint32 gid uint32 @@ -1209,6 +1208,18 @@ func (c *Container) addLocalVolumes(ctx context.Context, g *generate.Generator) } } + // Ensure the symlinks are resolved + resolvedSymlink, err := imagebuildah.ResolveSymLink(mountPoint, k) + if err != nil { + return errors.Wrapf(ErrCtrStateInvalid, "cannot resolve %s in %s for container %s", k, mountPoint, c.ID()) + } + var srcPath string + if resolvedSymlink != "" { + srcPath = filepath.Join(mountPoint, resolvedSymlink) + } else { + srcPath = filepath.Join(mountPoint, k) + } + if _, err := os.Stat(srcPath); os.IsNotExist(err) { logrus.Infof("Volume image mount point %s does not exist in root FS, need to create it", k) if err = os.MkdirAll(srcPath, 0755); err != nil { |