github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/vm/filesystem/filesystem.go (about) 1 package filesystem 2 3 import ( 4 "errors" 5 "io" 6 "io/fs" 7 8 lru "github.com/hashicorp/golang-lru/v2" 9 "golang.org/x/xerrors" 10 11 "github.com/devseccon/trivy/pkg/fanal/vm" 12 ) 13 14 const cacheSize = 2048 15 16 var ( 17 ErrInvalidHeader = xerrors.New("invalid Header error") 18 filesystems = []Filesystem{ 19 EXT4{}, 20 XFS{}, 21 } 22 ) 23 24 type Filesystem interface { 25 New(io.SectionReader, vm.Cache[string, any]) (fs.FS, error) 26 } 27 28 func New(sr io.SectionReader) (fs.FS, func(), error) { 29 var clean func() 30 31 // Initialize LRU cache for filesystem walking 32 lruCache, err := lru.New[string, any](cacheSize) 33 if err != nil { 34 return nil, clean, xerrors.Errorf("failed to create a LRU cache: %w", err) 35 } 36 clean = lruCache.Purge 37 38 for _, filesystem := range filesystems { 39 // TODO: implement LVM handler 40 fsys, err := filesystem.New(sr, lruCache) 41 if err != nil { 42 if errors.Is(err, ErrInvalidHeader) { 43 continue 44 } 45 return nil, clean, xerrors.Errorf("unexpected fs error: %w", err) 46 } 47 return fsys, clean, nil 48 } 49 return nil, clean, xerrors.New("unable to detect filesystem") 50 }