4
4
"context"
5
5
6
6
"github.com/mholt/archiver/v3"
7
- "github.com/scylladb/go-set/strset"
8
7
8
+ "github.com/anchore/syft/internal/log"
9
9
"github.com/anchore/syft/internal/sbomsync"
10
10
"github.com/anchore/syft/syft/file"
11
11
"github.com/anchore/syft/syft/pkg"
@@ -29,14 +29,16 @@ func NewUnknownsFinalizeTask(cfg UnknownsConfig) Task {
29
29
}
30
30
31
31
// processUnknowns removes unknown entries that have valid packages reported for the locations
32
- func (c UnknownsConfig ) processUnknowns (_ context.Context , _ file.Resolver , builder sbomsync.Builder ) error {
32
+ func (c UnknownsConfig ) processUnknowns (_ context.Context , resolver file.Resolver , builder sbomsync.Builder ) error {
33
33
accessor := builder .(sbomsync.Accessor )
34
- accessor .WriteToSBOM (c .finalize )
34
+ accessor .WriteToSBOM (func (s * sbom.SBOM ) {
35
+ c .finalize (resolver , s )
36
+ })
35
37
return nil
36
38
}
37
39
38
- func (c UnknownsConfig ) finalize (s * sbom.SBOM ) {
39
- hasPackageReference := coordinateReferenceLookup (s )
40
+ func (c UnknownsConfig ) finalize (resolver file. Resolver , s * sbom.SBOM ) {
41
+ hasPackageReference := coordinateReferenceLookup (resolver , s )
40
42
41
43
for coords := range s .Artifacts .Unknowns {
42
44
if ! hasPackageReference (coords ) {
@@ -67,22 +69,44 @@ func (c UnknownsConfig) finalize(s *sbom.SBOM) {
67
69
}
68
70
}
69
71
70
- func coordinateReferenceLookup (s * sbom.SBOM ) func (coords file.Coordinates ) bool {
72
+ func coordinateReferenceLookup (resolver file. Resolver , s * sbom.SBOM ) func (coords file.Coordinates ) bool {
71
73
allPackageCoords := file .NewCoordinateSet ()
74
+
75
+ // include all directly included locations that result in packages
72
76
for p := range s .Artifacts .Packages .Enumerate () {
73
77
allPackageCoords .Add (p .Locations .CoordinateSet ().ToSlice ()... )
74
78
}
75
79
76
- allMetadataFiles := strset .New ()
80
+ // include owned files, for example specified by package managers.
81
+ // relationships for these owned files may be disabled, but we always want to include them
77
82
for p := range s .Artifacts .Packages .Enumerate () {
78
83
if f , ok := p .Metadata .(pkg.FileOwner ); ok {
79
- for _ , o := range f .OwnedFiles () {
80
- allMetadataFiles .Add (o )
84
+ for _ , ownedFilePath := range f .OwnedFiles () {
85
+ // resolve these owned files, as they may have symlinks
86
+ // but coordinates we will test against are always absolute paths
87
+ locations , err := resolver .FilesByPath (ownedFilePath )
88
+ if err != nil {
89
+ log .Debugf ("unable to resolve owned file '%s': %v" , ownedFilePath , err )
90
+ }
91
+ for _ , loc := range locations {
92
+ allPackageCoords .Add (loc .Coordinates )
93
+ }
81
94
}
82
95
}
83
96
}
84
97
85
- return func (coords file.Coordinates ) bool {
86
- return allPackageCoords .Contains (coords ) || allMetadataFiles .Has (coords .RealPath )
98
+ // include relationships
99
+ for _ , r := range s .Relationships {
100
+ _ , fromPkgOk := r .From .(pkg.Package )
101
+ fromFile , fromFileOk := r .From .(file.Coordinates )
102
+ _ , toPkgOk := r .To .(pkg.Package )
103
+ toFile , toFileOk := r .To .(file.Coordinates )
104
+ if fromPkgOk && toFileOk {
105
+ allPackageCoords .Add (toFile )
106
+ } else if fromFileOk && toPkgOk {
107
+ allPackageCoords .Add (fromFile )
108
+ }
87
109
}
110
+
111
+ return allPackageCoords .Contains
88
112
}
0 commit comments