From 80f1169eca587305759829e626cebd2a434664f6 Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Wed, 19 May 2021 16:51:35 -0700 Subject: [PATCH] chrootarchive: don't create parent dirsoutside of chroot If chroot is used with a special root directory then create destination directory within chroot. This works automatically already due to extractor creating parent paths and is only used currently with cp where parent paths are actually required and error will be shown to user before reaching this point. Signed-off-by: Tonis Tiigi (cherry picked from commit 52d285184068998c22632bfb869f6294b5613a58) Signed-off-by: Brian Goff Conflict:NA Reference:https://github.com/moby/moby/commit/bce32e5c93be4caf1a592582155b9cb837fc129a --- components/engine/pkg/chrootarchive/archive.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/components/engine/pkg/chrootarchive/archive.go b/components/engine/pkg/chrootarchive/archive.go index 6ff61e6a7..9926b63b8 100644 --- a/components/engine/pkg/chrootarchive/archive.go +++ b/components/engine/pkg/chrootarchive/archive.go @@ -65,13 +65,17 @@ func untarHandler(tarArchive io.Reader, dest string, options *archive.TarOptions options.ExcludePatterns = []string{} } - idMapping := idtools.NewIDMappingsFromMaps(options.UIDMaps, options.GIDMaps) - rootIDs := idMapping.RootPair() + // If dest is inside a root then directory is created within chroot by extractor. + // This case is only currently used by cp. + if dest == root { + idMapping := idtools.NewIDMappingsFromMaps(options.UIDMaps, options.GIDMaps) + rootIDs := idMapping.RootPair() - dest = filepath.Clean(dest) - if _, err := os.Stat(dest); os.IsNotExist(err) { - if err := idtools.MkdirAllAndChownNew(dest, 0755, rootIDs); err != nil { - return err + dest = filepath.Clean(dest) + if _, err := os.Stat(dest); os.IsNotExist(err) { + if err := idtools.MkdirAllAndChownNew(dest, 0755, rootIDs); err != nil { + return err + } } } -- 2.30.0