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  }