From febde1a23fbb6eba8c1e9e13e71cc100291b2bd6 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Tue, 14 Jun 2022 10:49:14 +0200 Subject: [PATCH] [v4.0-rhel] container: do not create .containerenv with -v SRC:/run if /run is on a volume do not create the file /run/.containerenv as it would leak outside of the container. Closes: https://github.com/containers/podman/issues/14577 Backporting #14582 to v4.0-rhel to complete the backports to https://issues.redhat.com/browse/OCPBUGS-7522 Signed-off-by: Giuseppe Scrivano Signed-off-by: Tom Sweeney --- libpod/container_internal_linux.go | 13 ++++++++++++- test/e2e/run_volume_test.go | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index 6f809a3c4d..33156ce603 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -1939,8 +1939,19 @@ func (c *Container) makeBindMounts() error { } } + _, hasRunContainerenv := c.state.BindMounts["/run/.containerenv"] + if !hasRunContainerenv { + // check in the spec mounts + for _, m := range c.config.Spec.Mounts { + if m.Destination == "/run/.containerenv" || m.Destination == "/run" { + hasRunContainerenv = true + break + } + } + } + // Make .containerenv if it does not exist - if _, ok := c.state.BindMounts["/run/.containerenv"]; !ok { + if !hasRunContainerenv { containerenv := c.runtime.graphRootMountedFlag(c.config.Spec.Mounts) isRootless := 0 if rootless.IsRootless() { diff --git a/test/e2e/run_volume_test.go b/test/e2e/run_volume_test.go index d23c5dc14d..f999ee0ded 100644 --- a/test/e2e/run_volume_test.go +++ b/test/e2e/run_volume_test.go @@ -828,6 +828,20 @@ USER testuser`, fedoraMinimal) Expect(session.OutputToString()).To(Equal(perms)) }) + It("podman run with -v $SRC:/run does not create /run/.containerenv", func() { + mountSrc := filepath.Join(podmanTest.TempDir, "vol-test1") + err := os.MkdirAll(mountSrc, 0755) + Expect(err).To(BeNil()) + + session := podmanTest.Podman([]string{"run", "-v", mountSrc + ":/run", ALPINE, "true"}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + + // the file should not have been created + _, err = os.Stat(filepath.Join(mountSrc, ".containerenv")) + Expect(err).To(Not(BeNil())) + }) + It("podman volume with uid and gid works", func() { volName := "testVol" volCreate := podmanTest.Podman([]string{"volume", "create", "--opt", "o=uid=1000", volName})