Skip to content

Commit cbe7425

Browse files
Merge branch 'main' into upgradable-bypass
2 parents 6a38b76 + d48007a commit cbe7425

File tree

4 files changed

+92
-4
lines changed

4 files changed

+92
-4
lines changed

pkg/patch/platform.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ func filterPlatforms(discoveredPlatforms []types.PatchPlatform, targetPlatforms
8383
targetPlatform = platforms.Normalize(targetPlatform)
8484

8585
for _, discovered := range discoveredPlatforms {
86-
if platforms.Only(targetPlatform).Match(discovered.Platform) {
86+
// Use exact matching instead of platforms.Match to avoid cross-architecture matching
87+
// This will prevent matching amd64 with 386 even though they're both x86 family
88+
if targetPlatform.OS == discovered.OS &&
89+
targetPlatform.Architecture == discovered.Architecture &&
90+
targetPlatform.Variant == discovered.Variant {
8791
filtered = append(filtered, discovered)
8892
break
8993
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"SchemaVersion": 2,
3+
"ArtifactName": "quay.io/prometheus/alertmanager:v0.28.1",
4+
"ArtifactType": "container_image",
5+
"Metadata": {
6+
"ImageConfig": {
7+
"architecture": "amd64"
8+
}
9+
},
10+
"Results": [
11+
{
12+
"Target": "quay.io/prometheus/alertmanager:v0.28.1 (alpine 3.21.0)",
13+
"Class": "os-pkgs",
14+
"Type": "alpine",
15+
"Vulnerabilities": [
16+
{
17+
"VulnerabilityID": "CVE-2024-1234",
18+
"PkgID": "libssl3@3.3.2-r4",
19+
"PkgName": "libssl3",
20+
"InstalledVersion": "3.3.2-r4",
21+
"FixedVersion": "3.3.2-r5"
22+
}
23+
]
24+
}
25+
]
26+
}

pkg/report/trivy.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,13 +348,24 @@ func (t *TrivyParser) ParseWithLibraryPatchLevel(file, libraryPatchLevel string)
348348
}
349349

350350
// Extract Node.js and Yarn versions from image history
351-
nodeVersion, yarnVersion := extractVersionsFromImageHistory(report.Metadata.ImageConfig.History)
351+
var nodeVersion, yarnVersion string
352+
if report.Metadata.ImageConfig.History != nil {
353+
nodeVersion, yarnVersion = extractVersionsFromImageHistory(report.Metadata.ImageConfig.History)
354+
}
355+
356+
// Initialize OS metadata with safe defaults
357+
osType := ""
358+
osVersion := ""
359+
if report.Metadata.OS != nil {
360+
osType = string(report.Metadata.OS.Family)
361+
osVersion = report.Metadata.OS.Name
362+
}
352363

353364
updates := unversioned.UpdateManifest{
354365
Metadata: unversioned.Metadata{
355366
OS: unversioned.OS{
356-
Type: string(report.Metadata.OS.Family),
357-
Version: report.Metadata.OS.Name,
367+
Type: osType,
368+
Version: osVersion,
358369
},
359370
Config: unversioned.Config{
360371
Arch: report.Metadata.ImageConfig.Architecture,

pkg/report/trivy_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,3 +798,50 @@ func TestTrivyParserParseWithNodeJS(t *testing.T) {
798798
})
799799
}
800800
}
801+
802+
// TestTrivyParserParseNoHistory tests that the parser handles reports without ImageConfig.History gracefully.
803+
func TestTrivyParserParseNoHistory(t *testing.T) {
804+
tests := []struct {
805+
name string
806+
file string
807+
wantOSUpdates int
808+
wantLangUpdates int
809+
wantErr bool
810+
}{
811+
{
812+
name: "Trivy report without ImageConfig.History",
813+
file: "testdata/trivy_no_history.json",
814+
wantOSUpdates: 1,
815+
wantLangUpdates: 0,
816+
wantErr: false,
817+
},
818+
}
819+
820+
for _, tc := range tests {
821+
t.Run(tc.name, func(t *testing.T) {
822+
parser := &TrivyParser{}
823+
manifest, err := parser.Parse(tc.file)
824+
825+
if tc.wantErr {
826+
assert.Error(t, err)
827+
return
828+
}
829+
830+
assert.NoError(t, err)
831+
assert.NotNil(t, manifest)
832+
assert.Equal(t, tc.wantOSUpdates, len(manifest.OSUpdates))
833+
assert.Equal(t, tc.wantLangUpdates, len(manifest.LangUpdates))
834+
835+
// Validate that NodeVersion and YarnVersion are empty when no History is present
836+
assert.Empty(t, manifest.Metadata.NodeVersion, "NodeVersion should be empty when ImageConfig.History is nil")
837+
assert.Empty(t, manifest.Metadata.YarnVersion, "YarnVersion should be empty when ImageConfig.History is nil")
838+
839+
// Validate the OS update
840+
if tc.wantOSUpdates > 0 {
841+
assert.Equal(t, "libssl3", manifest.OSUpdates[0].Name)
842+
assert.Equal(t, "3.3.2-r4", manifest.OSUpdates[0].InstalledVersion)
843+
assert.Equal(t, "3.3.2-r5", manifest.OSUpdates[0].FixedVersion)
844+
}
845+
})
846+
}
847+
}

0 commit comments

Comments
 (0)