fix: index file itself when file scan path has symlink (#2359)

Previously, building the index of the filesystem when source was file
would fail if part of the path syft was passed to the file included a
symlinked directory, resulting in cataloging misses.

---------

Signed-off-by: Will Murphy <will.murphy@anchore.com>
This commit is contained in:
William Murphy 2023-11-28 09:41:28 -05:00 committed by GitHub
parent c08b0990ca
commit ce4b31757a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 44 additions and 3 deletions

View File

@ -159,11 +159,10 @@ func (s FileSource) FileResolver(_ Scope) (file.Resolver, error) {
}
isArchiveAnalysis := fi.IsDir()
absAnalysisPath, err := filepath.Abs(s.analysisPath)
absParentDir, err := absoluteSymlinkFreePathToParent(s.analysisPath)
if err != nil {
return nil, fmt.Errorf("unable to get absolute path for analysis path=%q: %w", s.analysisPath, err)
return nil, err
}
absParentDir := filepath.Dir(absAnalysisPath)
var res *fileresolver.Directory
if isArchiveAnalysis {
@ -210,6 +209,18 @@ func (s FileSource) FileResolver(_ Scope) (file.Resolver, error) {
return s.resolver, nil
}
func absoluteSymlinkFreePathToParent(path string) (string, error) {
absAnalysisPath, err := filepath.Abs(path)
if err != nil {
return "", fmt.Errorf("unable to get absolute path for analysis path=%q: %w", path, err)
}
dereferencedAbsAnalysisPath, err := filepath.EvalSymlinks(absAnalysisPath)
if err != nil {
return "", fmt.Errorf("unable to get absolute path for analysis path=%q: %w", path, err)
}
return filepath.Dir(dereferencedAbsAnalysisPath), nil
}
func (s *FileSource) Close() error {
if s.closer == nil {
return nil

View File

@ -48,6 +48,22 @@ func TestNewFromFile(t *testing.T) {
},
expRefs: 1,
},
{
desc: "normal path",
input: "test-fixtures/actual-path/empty",
testPathFn: func(resolver file.Resolver) ([]file.Location, error) {
return resolver.FilesByPath("empty")
},
expRefs: 1,
},
{
desc: "path containing symlink",
input: "test-fixtures/symlink/empty",
testPathFn: func(resolver file.Resolver) ([]file.Location, error) {
return resolver.FilesByPath("empty")
},
expRefs: 1,
},
}
for _, test := range testCases {
t.Run(test.desc, func(t *testing.T) {

View File

@ -0,0 +1 @@
actual-path

13
test/cli/symlink_test.go Normal file
View File

@ -0,0 +1,13 @@
package cli
import (
"github.com/stretchr/testify/assert"
"testing"
)
func Test_RequestedPathIncludesSymlink(t *testing.T) {
// path contains a symlink
path := "test-fixtures/image-pkg-coverage/pkgs/java/example-java-app-maven-0.1.0.jar"
_, stdout, _ := runSyft(t, nil, "packages", path)
assert.Contains(t, stdout, "example-java-app-maven")
}