From 1c923367988687920b05e99bc062a6b4982d03a9 Mon Sep 17 00:00:00 2001 From: WithoutPants <53250216+WithoutPants@users.noreply.github.com> Date: Tue, 25 Oct 2022 10:57:37 +1100 Subject: [PATCH] Fix symlink size calculation (#3046) --- pkg/file/fs.go | 5 +++++ pkg/file/scan.go | 16 +++++++++++++++- pkg/file/zip.go | 6 +++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/file/fs.go b/pkg/file/fs.go index 45d650fdf..8c09b0fe9 100644 --- a/pkg/file/fs.go +++ b/pkg/file/fs.go @@ -22,6 +22,7 @@ func (o *fsOpener) Open() (io.ReadCloser, error) { // FS represents a file system. type FS interface { + Stat(name string) (fs.FileInfo, error) Lstat(name string) (fs.FileInfo, error) Open(name string) (fs.ReadDirFile, error) OpenZip(name string) (*ZipFS, error) @@ -30,6 +31,10 @@ type FS interface { // OsFS is a file system backed by the OS. type OsFS struct{} +func (f *OsFS) Stat(name string) (fs.FileInfo, error) { + return os.Stat(name) +} + func (f *OsFS) Lstat(name string) (fs.FileInfo, error) { return os.Lstat(name) } diff --git a/pkg/file/scan.go b/pkg/file/scan.go index 47961fd79..358ff7a27 100644 --- a/pkg/file/scan.go +++ b/pkg/file/scan.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io/fs" + "os" "path/filepath" "strings" "sync" @@ -210,6 +211,19 @@ func (s *scanJob) queueFileFunc(ctx context.Context, f FS, zipFile *scanFile) fs return fmt.Errorf("reading info for %q: %w", path, err) } + var size int64 + + // #2196/#3042 - replace size with target size if file is a symlink + if info.Mode()&os.ModeSymlink == os.ModeSymlink { + targetInfo, err := f.Stat(path) + if err != nil { + return fmt.Errorf("reading info for symlink %q: %w", path, err) + } + size = targetInfo.Size() + } else { + size = info.Size() + } + if !s.acceptEntry(ctx, path, info) { if info.IsDir() { return fs.SkipDir @@ -225,7 +239,7 @@ func (s *scanJob) queueFileFunc(ctx context.Context, f FS, zipFile *scanFile) fs }, Path: path, Basename: filepath.Base(path), - Size: info.Size(), + Size: size, }, fs: f, info: info, diff --git a/pkg/file/zip.go b/pkg/file/zip.go index f610b8b1c..3cf4a819c 100644 --- a/pkg/file/zip.go +++ b/pkg/file/zip.go @@ -65,7 +65,7 @@ func (f *ZipFS) rel(name string) (string, error) { return relName, nil } -func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) { +func (f *ZipFS) Stat(name string) (fs.FileInfo, error) { reader, err := f.Open(name) if err != nil { return nil, err @@ -75,6 +75,10 @@ func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) { return reader.Stat() } +func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) { + return f.Stat(name) +} + func (f *ZipFS) OpenZip(name string) (*ZipFS, error) { return nil, errZipFSOpenZip }