github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/vm/disk/vmdk.go (about)

     1  package disk
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  
     7  	"github.com/masahiro331/go-vmdk-parser/pkg/virtualization/vmdk"
     8  	"golang.org/x/xerrors"
     9  
    10  	"github.com/devseccon/trivy/pkg/fanal/vm"
    11  )
    12  
    13  type VMDK struct{}
    14  
    15  func (VMDK) NewReader(rs io.ReadSeeker, cache vm.Cache[string, []byte]) (*io.SectionReader, error) {
    16  	if _, err := rs.Seek(0, io.SeekStart); err != nil {
    17  		return nil, xerrors.Errorf("seek error: %w", err)
    18  	}
    19  
    20  	if _, err := vmdk.Check(rs); err != nil {
    21  		return nil, vm.ErrInvalidSignature
    22  	}
    23  
    24  	if _, err := rs.Seek(0, io.SeekStart); err != nil {
    25  		return nil, xerrors.Errorf("seek error: %w", err)
    26  	}
    27  
    28  	reader, err := vmdk.Open(rs, cache)
    29  	if err != nil {
    30  		if errors.Is(err, vmdk.ErrUnSupportedType) {
    31  			return nil, xerrors.Errorf("%s: %w", err.Error(), vm.ErrUnsupportedType)
    32  		}
    33  		return nil, xerrors.Errorf("failed to open vmdk: %w", err)
    34  	}
    35  	return reader, nil
    36  }