diff --git a/syft/pkg/cataloger/apkdb/parse_apk_db.go b/syft/pkg/cataloger/apkdb/parse_apk_db.go index f814a2e32..b5a5be321 100644 --- a/syft/pkg/cataloger/apkdb/parse_apk_db.go +++ b/syft/pkg/cataloger/apkdb/parse_apk_db.go @@ -361,5 +361,11 @@ func stripVersionSpecifier(s string) string { // examples: // musl>=1 --> musl // cmd:scanelf=1.3.4-r0 --> cmd:scanelf - return splitAny(s, "<>=")[0] + + items := splitAny(s, "<>=") + if len(items) == 0 { + return s + } + + return items[0] } diff --git a/syft/pkg/cataloger/apkdb/parse_apk_db_test.go b/syft/pkg/cataloger/apkdb/parse_apk_db_test.go index 2e963b1c1..707c2d46e 100644 --- a/syft/pkg/cataloger/apkdb/parse_apk_db_test.go +++ b/syft/pkg/cataloger/apkdb/parse_apk_db_test.go @@ -911,6 +911,27 @@ func Test_discoverPackageDependencies(t *testing.T) { } }, }, + { + name: "strip version specifiers with empty provides value", + genFn: func() ([]pkg.Package, []artifact.Relationship) { + a := pkg.Package{ + Name: "package-a", + Metadata: pkg.ApkMetadata{ + Dependencies: []string{"so:libc.musl-x86_64.so.1"}, + }, + } + a.SetID() + b := pkg.Package{ + Name: "package-b", + Metadata: pkg.ApkMetadata{ + Provides: []string{""}, + }, + } + b.SetID() + + return []pkg.Package{a, b}, nil + }, + }, { name: "depends on package name", genFn: func() ([]pkg.Package, []artifact.Relationship) { @@ -1126,3 +1147,42 @@ func newLocationReadCloser(t *testing.T, path string) source.LocationReadCloser return source.NewLocationReadCloser(source.NewLocation(path), f) } + +func Test_stripVersionSpecifier(t *testing.T) { + tests := []struct { + name string + version string + want string + }{ + { + name: "empty expression", + version: "", + want: "", + }, + { + name: "no expression", + version: "cmd:foo", + want: "cmd:foo", + }, + { + name: "=", + version: "cmd:scanelf=1.3.4-r0", + want: "cmd:scanelf", + }, + { + name: ">=", + version: "cmd:scanelf>=1.3.4-r0", + want: "cmd:scanelf", + }, + { + name: "<", + version: "cmd:scanelf<1.3.4-r0", + want: "cmd:scanelf", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.want, stripVersionSpecifier(tt.version)) + }) + } +}