Fix symlink size calculation (#3046)

This commit is contained in:
WithoutPants 2022-10-25 10:57:37 +11:00 committed by GitHub
parent 5fae3cf127
commit 1c92336798
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 2 deletions

View File

@ -22,6 +22,7 @@ func (o *fsOpener) Open() (io.ReadCloser, error) {
// FS represents a file system. // FS represents a file system.
type FS interface { type FS interface {
Stat(name string) (fs.FileInfo, error)
Lstat(name string) (fs.FileInfo, error) Lstat(name string) (fs.FileInfo, error)
Open(name string) (fs.ReadDirFile, error) Open(name string) (fs.ReadDirFile, error)
OpenZip(name string) (*ZipFS, error) OpenZip(name string) (*ZipFS, error)
@ -30,6 +31,10 @@ type FS interface {
// OsFS is a file system backed by the OS. // OsFS is a file system backed by the OS.
type OsFS struct{} 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) { func (f *OsFS) Lstat(name string) (fs.FileInfo, error) {
return os.Lstat(name) return os.Lstat(name)
} }

View File

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"io/fs" "io/fs"
"os"
"path/filepath" "path/filepath"
"strings" "strings"
"sync" "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) 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 !s.acceptEntry(ctx, path, info) {
if info.IsDir() { if info.IsDir() {
return fs.SkipDir return fs.SkipDir
@ -225,7 +239,7 @@ func (s *scanJob) queueFileFunc(ctx context.Context, f FS, zipFile *scanFile) fs
}, },
Path: path, Path: path,
Basename: filepath.Base(path), Basename: filepath.Base(path),
Size: info.Size(), Size: size,
}, },
fs: f, fs: f,
info: info, info: info,

View File

@ -65,7 +65,7 @@ func (f *ZipFS) rel(name string) (string, error) {
return relName, nil 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) reader, err := f.Open(name)
if err != nil { if err != nil {
return nil, err return nil, err
@ -75,6 +75,10 @@ func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
return reader.Stat() return reader.Stat()
} }
func (f *ZipFS) Lstat(name string) (fs.FileInfo, error) {
return f.Stat(name)
}
func (f *ZipFS) OpenZip(name string) (*ZipFS, error) { func (f *ZipFS) OpenZip(name string) (*ZipFS, error) {
return nil, errZipFSOpenZip return nil, errZipFSOpenZip
} }