From 40fa7e99317a32046fec2442b61dc524f63e52cd Mon Sep 17 00:00:00 2001
From: Matthew Heon <matthew.heon@pm.me>
Date: Sun, 16 Feb 2020 18:16:26 -0500
Subject: Use cleaned destination path for indexing image volumes

We use filepath.Clean() to remove trailing slashes to ensure that
when we supercede image mounts with mounts from --volume and
--mount, paths are consistent when we compare. Unfortunately,
while we used the cleaned path for the destination in the mount,
it was accidentally not used to index the maps that we use to
identify what to supercede, so our comparisons might be thrown
off by trailing slashes and similar.

Fixes #5219

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
---
 pkg/spec/storage.go         |  5 +++--
 test/e2e/run_volume_test.go | 20 ++++++++++++++++++++
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/pkg/spec/storage.go b/pkg/spec/storage.go
index 0e2098c1d..182245cf1 100644
--- a/pkg/spec/storage.go
+++ b/pkg/spec/storage.go
@@ -739,6 +739,7 @@ func (config *CreateConfig) getImageVolumes() (map[string]spec.Mount, map[string
 
 	for vol := range config.BuiltinImgVolumes {
 		cleanDest := filepath.Clean(vol)
+		logrus.Debugf("Adding image volume at %s", cleanDest)
 		if config.ImageVolumeType == "tmpfs" {
 			// Tmpfs image volumes are handled as mounts
 			mount := spec.Mount{
@@ -747,13 +748,13 @@ func (config *CreateConfig) getImageVolumes() (map[string]spec.Mount, map[string
 				Type:        TypeTmpfs,
 				Options:     []string{"rprivate", "rw", "nodev", "exec"},
 			}
-			mounts[vol] = mount
+			mounts[cleanDest] = mount
 		} else {
 			// Anonymous volumes have no name.
 			namedVolume := new(libpod.ContainerNamedVolume)
 			namedVolume.Options = []string{"rprivate", "rw", "nodev", "exec"}
 			namedVolume.Dest = cleanDest
-			volumes[vol] = namedVolume
+			volumes[cleanDest] = namedVolume
 		}
 	}
 
diff --git a/test/e2e/run_volume_test.go b/test/e2e/run_volume_test.go
index 46c27dc2e..e31338dbc 100644
--- a/test/e2e/run_volume_test.go
+++ b/test/e2e/run_volume_test.go
@@ -15,6 +15,10 @@ import (
 	"github.com/onsi/gomega/gexec"
 )
 
+var VolumeTrailingSlashDockerfile = `
+FROM alpine:latest
+VOLUME /test/`
+
 var _ = Describe("Podman run with volumes", func() {
 	var (
 		tempdir    string
@@ -421,4 +425,20 @@ var _ = Describe("Podman run with volumes", func() {
 		Expect(len(outputArr)).To(Equal(1))
 		Expect(strings.Contains(outputArr[0], fileName)).To(BeTrue())
 	})
+
+	It("Podman mount over image volume with trailing /", func() {
+		image := "podman-volume-test:trailing"
+		podmanTest.BuildImage(VolumeTrailingSlashDockerfile, image, "false")
+
+		ctrName := "testCtr"
+		create := podmanTest.Podman([]string{"create", "-v", "/tmp:/test", "--name", ctrName, image, "ls"})
+		create.WaitWithDefaultTimeout()
+		Expect(create.ExitCode()).To(Equal(0))
+
+		data := podmanTest.InspectContainer(ctrName)
+		Expect(len(data)).To(Equal(1))
+		Expect(len(data[0].Mounts)).To(Equal(1))
+		Expect(data[0].Mounts[0].Source).To(Equal("/tmp"))
+		Expect(data[0].Mounts[0].Destination).To(Equal("/test"))
+	})
 })
-- 
cgit v1.2.3-54-g00ecf