From 74d93d1fa2dad8f029218b4ace89ceee75874056 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 17 Nov 2020 11:31:07 +0100 Subject: [PATCH] vendor: github.com/tonistiigi/fsutil 0834f99b7b85462efb69b4f571a4fa3ca7da5ac9 full diff: https://github.com/tonistiigi/fsutil/compare/ae3a8d753069d0f76fbee396457e8b6cfd7cb8c3...0834f99b7b85462efb69b4f571a4fa3ca7da5ac9 - walker: fix notadir error - improving error returns - more typed errors - remove extra verbosity (eg. PathError already contains action and path) - ensure stack traces are added to errors - various testing and linting fixes - copy: use Clonefileat from golang.org/x/sys/unix on macOS - go.mod: update opencontainers/go-digest v1.0.0 - github: test go1.15 Signed-off-by: Sebastiaan van Stijn --- vendor.conf | 2 +- .../docker/builder/dockerignore/deprecated.go | 17 +++++++++ .../tonistiigi/fsutil/chtimes_nolinux.go | 6 ++- vendor/github.com/tonistiigi/fsutil/diff.go | 6 +-- .../fsutil/diff_containerd_linux.go | 37 ------------------- .../tonistiigi/fsutil/diskwriter.go | 11 +++--- .../tonistiigi/fsutil/diskwriter_unix.go | 8 ++-- .../tonistiigi/fsutil/followlinks.go | 10 ++--- vendor/github.com/tonistiigi/fsutil/fs.go | 14 ++++--- vendor/github.com/tonistiigi/fsutil/go.mod | 11 ++---- .../github.com/tonistiigi/fsutil/hardlinks.go | 3 +- .../github.com/tonistiigi/fsutil/receive.go | 5 +-- vendor/github.com/tonistiigi/fsutil/send.go | 10 +++-- vendor/github.com/tonistiigi/fsutil/stat.go | 6 +-- .../github.com/tonistiigi/fsutil/tarwriter.go | 14 ++++--- .../github.com/tonistiigi/fsutil/validator.go | 7 ++-- vendor/github.com/tonistiigi/fsutil/walker.go | 18 ++++----- 17 files changed, 84 insertions(+), 101 deletions(-) create mode 100644 vendor/github.com/docker/docker/builder/dockerignore/deprecated.go delete mode 100644 vendor/github.com/tonistiigi/fsutil/diff_containerd_linux.go diff --git a/vendor.conf b/vendor.conf index 8ce39ea3bb..fdf8591ae9 100755 --- a/vendor.conf +++ b/vendor.conf @@ -67,7 +67,7 @@ github.com/sirupsen/logrus 6699a89a232f3db797f2e2806398 github.com/spf13/cobra 86f8bfd7fef868a174e1b606783bd7f5c82ddf8f # v1.1.1 github.com/spf13/pflag 2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab # v1.0.5 github.com/theupdateframework/notary d6e1431feb32348e0650bf7551ac5cffd01d857b # v0.6.1 -github.com/tonistiigi/fsutil ae3a8d753069d0f76fbee396457e8b6cfd7cb8c3 +github.com/tonistiigi/fsutil 0834f99b7b85462efb69b4f571a4fa3ca7da5ac9 github.com/tonistiigi/go-rosetta f79598599c5d34ea253b56a1d7c89bc6a96de7db github.com/tonistiigi/units 6950e57a87eaf136bbe44ef2ec8e75b9e3569de2 github.com/xeipuuv/gojsonpointer 02993c407bfbf5f6dae44c4f4b1cf6a39b5fc5bb diff --git a/vendor/github.com/docker/docker/builder/dockerignore/deprecated.go b/vendor/github.com/docker/docker/builder/dockerignore/deprecated.go new file mode 100644 index 0000000000..e387cc8ed2 --- /dev/null +++ b/vendor/github.com/docker/docker/builder/dockerignore/deprecated.go @@ -0,0 +1,17 @@ +// Package dockerignore is deprecated. Use github.com/moby/buildkit/frontend/dockerfile/dockerignore instead. +package dockerignore + +import ( + "io" + + "github.com/moby/buildkit/frontend/dockerfile/dockerignore" +) + +// ReadAll reads a .dockerignore file and returns the list of file patterns +// to ignore. Note this will trim whitespace from each line as well +// as use GO's "clean" func to get the shortest/cleanest path for each. +// +// Deprecated: use github.com/moby/buildkit/frontend/dockerfile/dockerignore.ReadAll instead. +func ReadAll(reader io.Reader) ([]string, error) { + return dockerignore.ReadAll(reader) +} diff --git a/vendor/github.com/tonistiigi/fsutil/chtimes_nolinux.go b/vendor/github.com/tonistiigi/fsutil/chtimes_nolinux.go index cdd80ec9a7..a3ba09881d 100644 --- a/vendor/github.com/tonistiigi/fsutil/chtimes_nolinux.go +++ b/vendor/github.com/tonistiigi/fsutil/chtimes_nolinux.go @@ -5,16 +5,18 @@ package fsutil import ( "os" "time" + + "github.com/pkg/errors" ) func chtimes(path string, un int64) error { mtime := time.Unix(0, un) fi, err := os.Lstat(path) if err != nil { - return err + return errors.WithStack(err) } if fi.Mode()&os.ModeSymlink != 0 { return nil } - return os.Chtimes(path, mtime, mtime) + return errors.WithStack(os.Chtimes(path, mtime, mtime)) } diff --git a/vendor/github.com/tonistiigi/fsutil/diff.go b/vendor/github.com/tonistiigi/fsutil/diff.go index 1cbc32b306..a7405dc533 100644 --- a/vendor/github.com/tonistiigi/fsutil/diff.go +++ b/vendor/github.com/tonistiigi/fsutil/diff.go @@ -19,9 +19,9 @@ type HandleChangeFn func(ChangeKind, string, os.FileInfo, error) error type ContentHasher func(*types.Stat) (hash.Hash, error) -func GetWalkerFn(root string) walkerFn { +func getWalkerFn(root string) walkerFn { return func(ctx context.Context, pathC chan<- *currentPath) error { - return Walk(ctx, root, nil, func(path string, f os.FileInfo, err error) error { + return errors.Wrap(Walk(ctx, root, nil, func(path string, f os.FileInfo, err error) error { if err != nil { return err } @@ -42,7 +42,7 @@ func GetWalkerFn(root string) walkerFn { case pathC <- p: return nil } - }) + }), "failed to walk") } } diff --git a/vendor/github.com/tonistiigi/fsutil/diff_containerd_linux.go b/vendor/github.com/tonistiigi/fsutil/diff_containerd_linux.go deleted file mode 100644 index 4ac7ec5ed7..0000000000 --- a/vendor/github.com/tonistiigi/fsutil/diff_containerd_linux.go +++ /dev/null @@ -1,37 +0,0 @@ -package fsutil - -import ( - "bytes" - "syscall" - - "github.com/containerd/continuity/sysx" - "github.com/pkg/errors" -) - -// compareSysStat returns whether the stats are equivalent, -// whether the files are considered the same file, and -// an error -func compareSysStat(s1, s2 interface{}) (bool, error) { - ls1, ok := s1.(*syscall.Stat_t) - if !ok { - return false, nil - } - ls2, ok := s2.(*syscall.Stat_t) - if !ok { - return false, nil - } - - return ls1.Mode == ls2.Mode && ls1.Uid == ls2.Uid && ls1.Gid == ls2.Gid && ls1.Rdev == ls2.Rdev, nil -} - -func compareCapabilities(p1, p2 string) (bool, error) { - c1, err := sysx.LGetxattr(p1, "security.capability") - if err != nil && err != syscall.ENODATA { - return false, errors.Wrapf(err, "failed to get xattr for %s", p1) - } - c2, err := sysx.LGetxattr(p2, "security.capability") - if err != nil && err != syscall.ENODATA { - return false, errors.Wrapf(err, "failed to get xattr for %s", p2) - } - return bytes.Equal(c1, c2), nil -} diff --git a/vendor/github.com/tonistiigi/fsutil/diskwriter.go b/vendor/github.com/tonistiigi/fsutil/diskwriter.go index 70323c88c9..786432264f 100644 --- a/vendor/github.com/tonistiigi/fsutil/diskwriter.go +++ b/vendor/github.com/tonistiigi/fsutil/diskwriter.go @@ -8,6 +8,7 @@ import ( "path/filepath" "strconv" "sync" + "syscall" "time" "github.com/opencontainers/go-digest" @@ -32,7 +33,6 @@ type DiskWriter struct { opt DiskWriterOpt dest string - wg sync.WaitGroup ctx context.Context cancel func() eg *errgroup.Group @@ -104,7 +104,7 @@ func (dw *DiskWriter) HandleChange(kind ChangeKind, p string, fi os.FileInfo, er stat, ok := fi.Sys().(*types.Stat) if !ok { - return errors.Errorf("%s invalid change without stat information", p) + return errors.WithStack(&os.PathError{Path: p, Err: syscall.EBADMSG, Op: "change without stat info"}) } statCopy := *stat @@ -118,13 +118,13 @@ func (dw *DiskWriter) HandleChange(kind ChangeKind, p string, fi os.FileInfo, er rename := true oldFi, err := os.Lstat(destPath) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, os.ErrNotExist) { if kind != ChangeKindAdd { - return errors.Wrapf(err, "invalid addition: %s", destPath) + return errors.Wrap(err, "modify/rm") } rename = false } else { - return errors.Wrapf(err, "failed to stat %s", destPath) + return errors.WithStack(err) } } @@ -285,7 +285,6 @@ func (hw *hashedWriter) Digest() digest.Digest { type lazyFileWriter struct { dest string - ctx context.Context f *os.File fileMode *os.FileMode } diff --git a/vendor/github.com/tonistiigi/fsutil/diskwriter_unix.go b/vendor/github.com/tonistiigi/fsutil/diskwriter_unix.go index ff0a22e3ca..aa2d298f40 100644 --- a/vendor/github.com/tonistiigi/fsutil/diskwriter_unix.go +++ b/vendor/github.com/tonistiigi/fsutil/diskwriter_unix.go @@ -17,17 +17,17 @@ func rewriteMetadata(p string, stat *types.Stat) error { } if err := os.Lchown(p, int(stat.Uid), int(stat.Gid)); err != nil { - return errors.Wrapf(err, "failed to lchown %s", p) + return errors.WithStack(err) } if os.FileMode(stat.Mode)&os.ModeSymlink == 0 { if err := os.Chmod(p, os.FileMode(stat.Mode)); err != nil { - return errors.Wrapf(err, "failed to chown %s", p) + return errors.WithStack(err) } } if err := chtimes(p, stat.ModTime); err != nil { - return errors.Wrapf(err, "failed to chtimes %s", p) + return err } return nil @@ -46,7 +46,7 @@ func handleTarTypeBlockCharFifo(path string, stat *types.Stat) error { } if err := syscall.Mknod(path, mode, int(mkdev(stat.Devmajor, stat.Devminor))); err != nil { - return err + return errors.WithStack(err) } return nil } diff --git a/vendor/github.com/tonistiigi/fsutil/followlinks.go b/vendor/github.com/tonistiigi/fsutil/followlinks.go index ed4af6e816..a0942413e8 100644 --- a/vendor/github.com/tonistiigi/fsutil/followlinks.go +++ b/vendor/github.com/tonistiigi/fsutil/followlinks.go @@ -77,10 +77,10 @@ func (r *symlinkResolver) readSymlink(p string, allowWildcard bool) ([]string, e if allowWildcard && containsWildcards(base) { fis, err := ioutil.ReadDir(filepath.Dir(realPath)) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, os.ErrNotExist) { return nil, nil } - return nil, errors.Wrapf(err, "failed to read dir %s", filepath.Dir(realPath)) + return nil, errors.Wrap(err, "readdir") } var out []string for _, f := range fis { @@ -97,17 +97,17 @@ func (r *symlinkResolver) readSymlink(p string, allowWildcard bool) ([]string, e fi, err := os.Lstat(realPath) if err != nil { - if os.IsNotExist(err) { + if errors.Is(err, os.ErrNotExist) { return nil, nil } - return nil, errors.Wrapf(err, "failed to lstat %s", realPath) + return nil, errors.WithStack(err) } if fi.Mode()&os.ModeSymlink == 0 { return nil, nil } link, err := os.Readlink(realPath) if err != nil { - return nil, errors.Wrapf(err, "failed to readlink %s", realPath) + return nil, errors.WithStack(err) } link = filepath.Clean(link) if filepath.IsAbs(link) { diff --git a/vendor/github.com/tonistiigi/fsutil/fs.go b/vendor/github.com/tonistiigi/fsutil/fs.go index a9467e9402..e26110b320 100644 --- a/vendor/github.com/tonistiigi/fsutil/fs.go +++ b/vendor/github.com/tonistiigi/fsutil/fs.go @@ -9,6 +9,7 @@ import ( "path/filepath" "sort" "strings" + "syscall" "github.com/pkg/errors" "github.com/tonistiigi/fsutil/types" @@ -36,7 +37,8 @@ func (fs *fs) Walk(ctx context.Context, fn filepath.WalkFunc) error { } func (fs *fs) Open(p string) (io.ReadCloser, error) { - return os.Open(filepath.Join(fs.root, p)) + rc, err := os.Open(filepath.Join(fs.root, p)) + return rc, errors.WithStack(err) } type Dir struct { @@ -51,10 +53,10 @@ func SubDirFS(dirs []Dir) (FS, error) { m := map[string]Dir{} for _, d := range dirs { if path.Base(d.Stat.Path) != d.Stat.Path { - return nil, errors.Errorf("subdir %s must be single file", d.Stat.Path) + return nil, errors.WithStack(&os.PathError{Path: d.Stat.Path, Err: syscall.EISDIR, Op: "invalid path"}) } if _, ok := m[d.Stat.Path]; ok { - return nil, errors.Errorf("invalid path %s", d.Stat.Path) + return nil, errors.WithStack(&os.PathError{Path: d.Stat.Path, Err: syscall.EEXIST, Op: "duplicate path"}) } m[d.Stat.Path] = d } @@ -70,7 +72,7 @@ func (fs *subDirFS) Walk(ctx context.Context, fn filepath.WalkFunc) error { for _, d := range fs.dirs { fi := &StatInfo{Stat: &d.Stat} if !fi.IsDir() { - return errors.Errorf("fs subdir %s not mode directory", d.Stat.Path) + return errors.WithStack(&os.PathError{Path: d.Stat.Path, Err: syscall.ENOTDIR, Op: "walk subdir"}) } if err := fn(d.Stat.Path, fi, nil); err != nil { return err @@ -78,7 +80,7 @@ func (fs *subDirFS) Walk(ctx context.Context, fn filepath.WalkFunc) error { if err := d.FS.Walk(ctx, func(p string, fi os.FileInfo, err error) error { stat, ok := fi.Sys().(*types.Stat) if !ok { - return errors.Wrapf(err, "invalid fileinfo without stat info: %s", p) + return errors.WithStack(&os.PathError{Path: d.Stat.Path, Err: syscall.EBADMSG, Op: "fileinfo without stat info"}) } stat.Path = path.Join(d.Stat.Path, stat.Path) if stat.Linkname != "" { @@ -105,7 +107,7 @@ func (fs *subDirFS) Open(p string) (io.ReadCloser, error) { } d, ok := fs.m[parts[0]] if !ok { - return nil, os.ErrNotExist + return nil, errors.WithStack(&os.PathError{Path: parts[0], Err: syscall.ENOENT, Op: "open"}) } return d.FS.Open(parts[1]) } diff --git a/vendor/github.com/tonistiigi/fsutil/go.mod b/vendor/github.com/tonistiigi/fsutil/go.mod index ed41f5301a..075742a89f 100644 --- a/vendor/github.com/tonistiigi/fsutil/go.mod +++ b/vendor/github.com/tonistiigi/fsutil/go.mod @@ -5,21 +5,16 @@ go 1.13 require ( github.com/Microsoft/hcsshim v0.8.9 // indirect github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc - github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c github.com/gogo/protobuf v1.3.1 - github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect github.com/moby/sys/mount v0.1.0 // indirect github.com/moby/sys/mountinfo v0.1.3 // indirect - github.com/onsi/ginkgo v1.7.0 // indirect - github.com/onsi/gomega v1.4.3 // indirect - github.com/opencontainers/go-digest v1.0.0-rc1 + github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.0.1 // indirect github.com/opencontainers/runc v1.0.0-rc10 // indirect github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.5.1 golang.org/x/sync v0.0.0-20190423024810-112230192c58 - golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae - gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect - gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect + golang.org/x/sys v0.0.0-20200917073148-efd3b9a0ff20 + gotest.tools/v3 v3.0.2 // indirect ) diff --git a/vendor/github.com/tonistiigi/fsutil/hardlinks.go b/vendor/github.com/tonistiigi/fsutil/hardlinks.go index d977f0d6bb..ef8bbfb5da 100644 --- a/vendor/github.com/tonistiigi/fsutil/hardlinks.go +++ b/vendor/github.com/tonistiigi/fsutil/hardlinks.go @@ -2,6 +2,7 @@ package fsutil import ( "os" + "syscall" "github.com/pkg/errors" "github.com/tonistiigi/fsutil/types" @@ -28,7 +29,7 @@ func (v *Hardlinks) HandleChange(kind ChangeKind, p string, fi os.FileInfo, err stat, ok := fi.Sys().(*types.Stat) if !ok { - return errors.Errorf("invalid change without stat info: %s", p) + return errors.WithStack(&os.PathError{Path: p, Err: syscall.EBADMSG, Op: "change without stat info"}) } if fi.IsDir() || fi.Mode()&os.ModeSymlink != 0 { diff --git a/vendor/github.com/tonistiigi/fsutil/receive.go b/vendor/github.com/tonistiigi/fsutil/receive.go index 0210dcdb1a..5c6a486978 100644 --- a/vendor/github.com/tonistiigi/fsutil/receive.go +++ b/vendor/github.com/tonistiigi/fsutil/receive.go @@ -20,7 +20,7 @@ type ReceiveOpt struct { } func Receive(ctx context.Context, conn Stream, dest string, opt ReceiveOpt) error { - ctx, cancel := context.WithCancel(context.Background()) + ctx, cancel := context.WithCancel(ctx) defer cancel() r := &receiver{ @@ -105,7 +105,6 @@ func (w *dynamicWalker) fill(ctx context.Context, pathC chan<- *currentPath) err return ctx.Err() } } - return nil } func (r *receiver) run(ctx context.Context) error { @@ -131,7 +130,7 @@ func (r *receiver) run(ctx context.Context) error { }() destWalker := emptyWalker if !r.merge { - destWalker = GetWalkerFn(r.dest) + destWalker = getWalkerFn(r.dest) } err := doubleWalkDiff(ctx, dw.HandleChange, destWalker, w.fill, r.filter) if err != nil { diff --git a/vendor/github.com/tonistiigi/fsutil/send.go b/vendor/github.com/tonistiigi/fsutil/send.go index e7c5a37d1b..2c1a3801d5 100644 --- a/vendor/github.com/tonistiigi/fsutil/send.go +++ b/vendor/github.com/tonistiigi/fsutil/send.go @@ -5,6 +5,7 @@ import ( "io" "os" "sync" + "syscall" "github.com/pkg/errors" "github.com/tonistiigi/fsutil/types" @@ -13,7 +14,8 @@ import ( var bufPool = sync.Pool{ New: func() interface{} { - return make([]byte, 32*1<<10) + buf := make([]byte, 32*1<<10) + return &buf }, } @@ -131,9 +133,9 @@ func (s *sender) sendFile(h *sendHandle) error { f, err := s.fs.Open(h.path) if err == nil { defer f.Close() - buf := bufPool.Get().([]byte) + buf := bufPool.Get().(*[]byte) defer bufPool.Put(buf) - if _, err := io.CopyBuffer(&fileSender{sender: s, id: h.id}, f, buf); err != nil { + if _, err := io.CopyBuffer(&fileSender{sender: s, id: h.id}, f, *buf); err != nil { return err } } @@ -148,7 +150,7 @@ func (s *sender) walk(ctx context.Context) error { } stat, ok := fi.Sys().(*types.Stat) if !ok { - return errors.Wrapf(err, "invalid fileinfo without stat info: %s", path) + return errors.WithStack(&os.PathError{Path: path, Err: syscall.EBADMSG, Op: "fileinfo without stat info"}) } p := &types.Packet{ diff --git a/vendor/github.com/tonistiigi/fsutil/stat.go b/vendor/github.com/tonistiigi/fsutil/stat.go index 789dce3dbf..2ab8da118e 100644 --- a/vendor/github.com/tonistiigi/fsutil/stat.go +++ b/vendor/github.com/tonistiigi/fsutil/stat.go @@ -31,13 +31,13 @@ func mkstat(path, relpath string, fi os.FileInfo, inodemap map[uint64]string) (* if fi.Mode()&os.ModeSymlink != 0 { link, err := os.Readlink(path) if err != nil { - return nil, errors.Wrapf(err, "failed to readlink %s", path) + return nil, errors.WithStack(err) } stat.Linkname = link } } if err := loadXattr(path, stat); err != nil { - return nil, errors.Wrapf(err, "failed to xattr %s", relpath) + return nil, err } if runtime.GOOS == "windows" { @@ -58,7 +58,7 @@ func mkstat(path, relpath string, fi os.FileInfo, inodemap map[uint64]string) (* func Stat(path string) (*types.Stat, error) { fi, err := os.Lstat(path) if err != nil { - return nil, errors.Wrap(err, "os stat") + return nil, errors.WithStack(err) } return mkstat(path, filepath.Base(path), fi, nil) } diff --git a/vendor/github.com/tonistiigi/fsutil/tarwriter.go b/vendor/github.com/tonistiigi/fsutil/tarwriter.go index 06f28c55ff..bd46a2250f 100644 --- a/vendor/github.com/tonistiigi/fsutil/tarwriter.go +++ b/vendor/github.com/tonistiigi/fsutil/tarwriter.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" "strings" + "syscall" "github.com/pkg/errors" "github.com/tonistiigi/fsutil/types" @@ -15,9 +16,12 @@ import ( func WriteTar(ctx context.Context, fs FS, w io.Writer) error { tw := tar.NewWriter(w) err := fs.Walk(ctx, func(path string, fi os.FileInfo, err error) error { + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } stat, ok := fi.Sys().(*types.Stat) if !ok { - return errors.Wrapf(err, "invalid fileinfo without stat info: %s", path) + return errors.WithStack(&os.PathError{Path: path, Err: syscall.EBADMSG, Op: "fileinfo without stat info"}) } hdr, err := tar.FileInfoHeader(fi, stat.Linkname) if err != nil { @@ -37,7 +41,7 @@ func WriteTar(ctx context.Context, fs FS, w io.Writer) error { hdr.Linkname = stat.Linkname if hdr.Linkname != "" { hdr.Size = 0 - if fi.Mode() & os.ModeSymlink != 0 { + if fi.Mode()&os.ModeSymlink != 0 { hdr.Typeflag = tar.TypeSymlink } else { hdr.Typeflag = tar.TypeLink @@ -52,7 +56,7 @@ func WriteTar(ctx context.Context, fs FS, w io.Writer) error { } if err := tw.WriteHeader(hdr); err != nil { - return errors.Wrap(err, "failed to write file header") + return errors.Wrapf(err, "failed to write file header %s", name) } if hdr.Typeflag == tar.TypeReg && hdr.Size > 0 && hdr.Linkname == "" { @@ -61,10 +65,10 @@ func WriteTar(ctx context.Context, fs FS, w io.Writer) error { return err } if _, err := io.Copy(tw, rc); err != nil { - return err + return errors.WithStack(err) } if err := rc.Close(); err != nil { - return err + return errors.WithStack(err) } } return nil diff --git a/vendor/github.com/tonistiigi/fsutil/validator.go b/vendor/github.com/tonistiigi/fsutil/validator.go index 2bd1287a85..9bd7d94d36 100644 --- a/vendor/github.com/tonistiigi/fsutil/validator.go +++ b/vendor/github.com/tonistiigi/fsutil/validator.go @@ -6,6 +6,7 @@ import ( "runtime" "sort" "strings" + "syscall" "github.com/pkg/errors" ) @@ -31,10 +32,10 @@ func (v *Validator) HandleChange(kind ChangeKind, p string, fi os.FileInfo, err p = strings.Replace(p, "\\", "", -1) } if p != path.Clean(p) { - return errors.Errorf("invalid unclean path %s", p) + return errors.WithStack(&os.PathError{Path: p, Err: syscall.EINVAL, Op: "unclean path"}) } if path.IsAbs(p) { - return errors.Errorf("abolute path %s not allowed", p) + return errors.WithStack(&os.PathError{Path: p, Err: syscall.EINVAL, Op: "absolute path"}) } dir := path.Dir(p) base := path.Base(p) @@ -42,7 +43,7 @@ func (v *Validator) HandleChange(kind ChangeKind, p string, fi os.FileInfo, err dir = "" } if dir == ".." || strings.HasPrefix(p, "../") { - return errors.Errorf("invalid path: %s", p) + return errors.WithStack(&os.PathError{Path: p, Err: syscall.EINVAL, Op: "escape check"}) } // find a parent dir from saved records diff --git a/vendor/github.com/tonistiigi/fsutil/walker.go b/vendor/github.com/tonistiigi/fsutil/walker.go index 6004b88850..b10383e4c5 100644 --- a/vendor/github.com/tonistiigi/fsutil/walker.go +++ b/vendor/github.com/tonistiigi/fsutil/walker.go @@ -25,21 +25,21 @@ type WalkOpt struct { func Walk(ctx context.Context, p string, opt *WalkOpt, fn filepath.WalkFunc) error { root, err := filepath.EvalSymlinks(p) if err != nil { - return errors.Wrapf(err, "failed to resolve %s", root) + return errors.WithStack(&os.PathError{Op: "resolve", Path: root, Err: err}) } fi, err := os.Stat(root) if err != nil { - return errors.Wrapf(err, "failed to stat: %s", root) + return errors.WithStack(err) } if !fi.IsDir() { - return errors.Errorf("%s is not a directory", root) + return errors.WithStack(&os.PathError{Op: "walk", Path: root, Err: syscall.ENOTDIR}) } var pm *fileutils.PatternMatcher if opt != nil && opt.ExcludePatterns != nil { pm, err = fileutils.NewPatternMatcher(opt.ExcludePatterns) if err != nil { - return errors.Wrapf(err, "invalid excludepaths %s", opt.ExcludePatterns) + return errors.Wrapf(err, "invalid excludepatterns: %s", opt.ExcludePatterns) } } @@ -65,17 +65,15 @@ func Walk(ctx context.Context, p string, opt *WalkOpt, fn filepath.WalkFunc) err seenFiles := make(map[uint64]string) return filepath.Walk(root, func(path string, fi os.FileInfo, err error) (retErr error) { - if err != nil { - if os.IsNotExist(err) { - return filepath.SkipDir - } - return err - } defer func() { if retErr != nil && isNotExist(retErr) { retErr = filepath.SkipDir } }() + if err != nil { + return err + } + origpath := path path, err = filepath.Rel(root, path) if err != nil {