Skip to content

Commit fe42bce

Browse files
fix(purl-backfill): respect arch qualifier (#4987)
* fix(purl-backfill): respect arch qualifier Previously, when constructing rpm, alpm, and apk metadata struct from a PURL, Syft would ignore the arch qualifier. Start respecting that qualifier. Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> * chore: fix static analysis Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> * Clean up control flow in PURL backfill code Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> --------- Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com>
1 parent fea4a50 commit fe42bce

4 files changed

Lines changed: 361 additions & 30 deletions

File tree

syft/format/internal/backfill.go

Lines changed: 98 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func backfillFromPurl(p *pkg.Package) {
4848
var cpes []cpe.CPE
4949
epoch := ""
5050
rpmmod := ""
51+
arch := ""
5152

5253
for _, qualifier := range purl.Qualifiers {
5354
switch qualifier.Key {
@@ -65,6 +66,8 @@ func backfillFromPurl(p *pkg.Package) {
6566
epoch = qualifier.Value
6667
case pkg.PURLQualifierRpmModularity:
6768
rpmmod = qualifier.Value
69+
case pkg.PURLQualifierArch:
70+
arch = qualifier.Value
6871
}
6972
}
7073

@@ -84,9 +87,7 @@ func backfillFromPurl(p *pkg.Package) {
8487
setJavaMetadataFromPurl(p, purl)
8588
}
8689

87-
if p.Type == pkg.RpmPkg {
88-
setRpmMetadataFromPurl(p, rpmmod)
89-
}
90+
setDistroMetadata(p, rpmmod, arch)
9091

9192
for _, c := range cpes {
9293
if slices.Contains(p.CPEs, c) {
@@ -96,6 +97,19 @@ func backfillFromPurl(p *pkg.Package) {
9697
}
9798
}
9899

100+
func setDistroMetadata(p *pkg.Package, rpmmod, arch string) {
101+
switch p.Type {
102+
case pkg.RpmPkg:
103+
setRpmMetadataFromPurl(p, rpmmod, arch)
104+
case pkg.DebPkg:
105+
setDpkgMetadataFromPurl(p, arch)
106+
case pkg.AlpmPkg:
107+
setAlpmMetadataFromPurl(p, arch)
108+
case pkg.ApkPkg:
109+
setApkMetadataFromPurl(p, arch)
110+
}
111+
}
112+
99113
func setJavaMetadataFromPurl(p *pkg.Package, _ packageurl.PackageURL) {
100114
if p.Type != pkg.JavaPkg {
101115
return
@@ -107,32 +121,103 @@ func setJavaMetadataFromPurl(p *pkg.Package, _ packageurl.PackageURL) {
107121
}
108122
}
109123

110-
func setRpmMetadataFromPurl(p *pkg.Package, rpmmod string) {
124+
func setRpmMetadataFromPurl(p *pkg.Package, rpmmod, arch string) {
111125
if p.Type != pkg.RpmPkg {
112126
return
113127
}
114-
if rpmmod == "" {
128+
if rpmmod == "" && arch == "" {
115129
return
116130
}
117131

118132
if p.Metadata == nil {
119-
p.Metadata = pkg.RpmDBEntry{
120-
ModularityLabel: &rpmmod,
121-
}
122-
return
133+
p.Metadata = pkg.RpmDBEntry{}
123134
}
124135

125136
switch m := p.Metadata.(type) {
126137
case pkg.RpmDBEntry:
127-
if m.ModularityLabel == nil {
138+
if m.ModularityLabel == nil && rpmmod != "" {
128139
m.ModularityLabel = &rpmmod
129-
p.Metadata = m
130140
}
141+
if m.Arch == "" {
142+
m.Arch = arch
143+
}
144+
p.Metadata = m
131145
case pkg.RpmArchive:
132-
if m.ModularityLabel == nil {
146+
if m.ModularityLabel == nil && rpmmod != "" {
133147
m.ModularityLabel = &rpmmod
134-
p.Metadata = m
135148
}
149+
if m.Arch == "" {
150+
m.Arch = arch
151+
}
152+
p.Metadata = m
153+
}
154+
}
155+
156+
func setDpkgMetadataFromPurl(p *pkg.Package, arch string) {
157+
if p.Type != pkg.DebPkg {
158+
return
159+
}
160+
if arch == "" {
161+
return
162+
}
163+
164+
if p.Metadata == nil {
165+
p.Metadata = pkg.DpkgDBEntry{}
166+
}
167+
168+
switch m := p.Metadata.(type) {
169+
case pkg.DpkgDBEntry:
170+
if m.Architecture == "" {
171+
m.Architecture = arch
172+
}
173+
p.Metadata = m
174+
case pkg.DpkgArchiveEntry:
175+
if m.Architecture == "" {
176+
m.Architecture = arch
177+
}
178+
p.Metadata = m
179+
}
180+
}
181+
182+
func setAlpmMetadataFromPurl(p *pkg.Package, arch string) {
183+
if p.Type != pkg.AlpmPkg {
184+
return
185+
}
186+
if arch == "" {
187+
return
188+
}
189+
190+
if p.Metadata == nil {
191+
p.Metadata = pkg.AlpmDBEntry{Architecture: arch}
192+
return
193+
}
194+
195+
if m, ok := p.Metadata.(pkg.AlpmDBEntry); ok {
196+
if m.Architecture == "" {
197+
m.Architecture = arch
198+
}
199+
p.Metadata = m
200+
}
201+
}
202+
203+
func setApkMetadataFromPurl(p *pkg.Package, arch string) {
204+
if p.Type != pkg.ApkPkg {
205+
return
206+
}
207+
if arch == "" {
208+
return
209+
}
210+
211+
if p.Metadata == nil {
212+
p.Metadata = pkg.ApkDBEntry{Architecture: arch}
213+
return
214+
}
215+
216+
if m, ok := p.Metadata.(pkg.ApkDBEntry); ok {
217+
if m.Architecture == "" {
218+
m.Architecture = arch
219+
}
220+
p.Metadata = m
136221
}
137222
}
138223

0 commit comments

Comments
 (0)