diff --git a/archive/tar.go b/archive/tar.go index 1ea14d31d..2be4a9051 100644 --- a/archive/tar.go +++ b/archive/tar.go @@ -574,11 +574,9 @@ func (cw *ChangeWriter) HandleChange(k fs.ChangeKind, p string, f os.FileInfo, e return fmt.Errorf("failed to make path relative: %w", err) } } - name, err = tarName(name) - if err != nil { - return fmt.Errorf("cannot canonicalize path: %w", err) - } - // suffix with '/' for directories + // Canonicalize to POSIX-style paths using forward slashes. Directory + // entries must end with a slash. + name = filepath.ToSlash(name) if f.IsDir() && !strings.HasSuffix(name, "/") { name += "/" } diff --git a/archive/tar_unix.go b/archive/tar_unix.go index 2f3a3a392..ed2b5e696 100644 --- a/archive/tar_unix.go +++ b/archive/tar_unix.go @@ -34,10 +34,6 @@ import ( "golang.org/x/sys/unix" ) -func tarName(p string) (string, error) { - return p, nil -} - func chmodTarEntry(perm os.FileMode) os.FileMode { return perm } diff --git a/archive/tar_windows.go b/archive/tar_windows.go index bd99a5cc1..dc8f64ee4 100644 --- a/archive/tar_windows.go +++ b/archive/tar_windows.go @@ -26,21 +26,6 @@ import ( "github.com/moby/sys/sequential" ) -// tarName returns platform-specific filepath -// to canonical posix-style path for tar archival. p is relative -// path. -func tarName(p string) (string, error) { - // windows: convert windows style relative path with backslashes - // into forward slashes. Since windows does not allow '/' or '\' - // in file names, it is mostly safe to replace however we must - // check just in case - if strings.Contains(p, "/") { - return "", fmt.Errorf("windows path contains forward slash: %s", p) - } - - return strings.Replace(p, string(os.PathSeparator), "/", -1), nil -} - // chmodTarEntry is used to adjust the file permissions used in tar header based // on the platform the archival is done. func chmodTarEntry(perm os.FileMode) os.FileMode {