From e13c9e78135f5c7c2968673d211602f9479f8aaf Mon Sep 17 00:00:00 2001 From: Kudryavcev Nikolay <35200428+Rupikz@users.noreply.github.com> Date: Mon, 5 May 2025 18:37:47 +0300 Subject: [PATCH] fix: propagate unarchive error of file source (#3845) Signed-off-by: Kudryavcev Nikolay --- syft/source/filesource/file_source.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/syft/source/filesource/file_source.go b/syft/source/filesource/file_source.go index fead9cce5..09a4422ce 100644 --- a/syft/source/filesource/file_source.go +++ b/syft/source/filesource/file_source.go @@ -59,7 +59,10 @@ func New(cfg Config) (source.Source, error) { return nil, fmt.Errorf("given path is a directory: %q", cfg.Path) } - analysisPath, cleanupFn := fileAnalysisPath(cfg.Path, cfg.SkipExtractArchive) + analysisPath, cleanupFn, err := fileAnalysisPath(cfg.Path, cfg.SkipExtractArchive) + if err != nil { + return nil, fmt.Errorf("unable to extract file analysis path=%q: %w", cfg.Path, err) + } var digests []file.Digest if len(cfg.DigestAlgorithms) > 0 { @@ -209,12 +212,12 @@ func (s *fileSource) Close() error { // contents have been made available. A cleanup function is provided for any temp files created (if any). // Users can disable unpacking archives, allowing individual cataloguers to extract them instead (where // supported) -func fileAnalysisPath(path string, skipExtractArchive bool) (string, func() error) { +func fileAnalysisPath(path string, skipExtractArchive bool) (string, func() error, error) { var cleanupFn = func() error { return nil } var analysisPath = path if skipExtractArchive { - return analysisPath, cleanupFn + return analysisPath, cleanupFn, nil } // if the given file is an archive (as indicated by the file extension and not MIME type) then unarchive it and @@ -228,19 +231,16 @@ func fileAnalysisPath(path string, skipExtractArchive bool) (string, func() erro // NOTE: this currently does not display any messages if an overwrite happens tar.OverwriteExisting = true } - unarchivedPath, tmpCleanup, err := unarchiveToTmp(path, unarchiver) + + analysisPath, cleanupFn, err = unarchiveToTmp(path, unarchiver) if err != nil { - log.Warnf("file could not be unarchived: %+v", err) - } else { - log.Debugf("source path is an archive") - analysisPath = unarchivedPath - } - if tmpCleanup != nil { - cleanupFn = tmpCleanup + return "", nil, fmt.Errorf("unable to unarchive source file: %w", err) } + + log.Debugf("source path is an archive") } - return analysisPath, cleanupFn + return analysisPath, cleanupFn, nil } func digestOfFileContents(path string) string {