From f950de575483f562bc56b7f42b67b00b3df1387b Mon Sep 17 00:00:00 2001 From: John Howard Date: Tue, 25 Aug 2015 13:26:49 -0700 Subject: [PATCH] Windows: Fix docker cp Signed-off-by: John Howard --- daemon/archive.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/daemon/archive.go b/daemon/archive.go index dc7c8b05b8..e8934c098f 100644 --- a/daemon/archive.go +++ b/daemon/archive.go @@ -5,6 +5,7 @@ import ( "io" "os" "path/filepath" + "strings" "github.com/docker/docker/api/types" "github.com/docker/docker/pkg/archive" @@ -275,7 +276,22 @@ func (container *Container) ExtractToDir(path string, noOverwriteDirNonDir bool, // Use the resolved path relative to the container rootfs as the new // absPath. This way we fully follow any symlinks in a volume that may // lead back outside the volume. - baseRel, err := filepath.Rel(container.basefs, resolvedPath) + // + // The Windows implementation of filepath.Rel in golang 1.4 does not + // support volume style file path semantics. On Windows when using the + // filter driver, we are guaranteed that the path will always be + // a volume file path. + var baseRel string + if strings.HasPrefix(resolvedPath, `\\?\Volume{`) { + if strings.HasPrefix(resolvedPath, container.basefs) { + baseRel = resolvedPath[len(container.basefs):] + if baseRel[:1] == `\` { + baseRel = baseRel[1:] + } + } + } else { + baseRel, err = filepath.Rel(container.basefs, resolvedPath) + } if err != nil { return err }