Skip to content

Commit d5b6d92

Browse files
committed
fix: resolve CVE logs only showing entries up to 2021
Add parseBinaryPackages function to handle three binary field formats: - JSON object array: [{"name":"pkg", ...}] - String-encoded JSON: "[{\"name\":\"pkg\", ...}]" - Legacy Python-style list: ['pkg1', 'pkg2'] Refactor updateCVEMetaDataSync to use parseBinaryPackages. PMS: TASK-387925
1 parent 1a249a4 commit d5b6d92

2 files changed

Lines changed: 137 additions & 15 deletions

File tree

src/internal/updateplatform/message_report.go

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1325,6 +1325,51 @@ func loadLocalCVEData() []byte {
13251325
return data
13261326
}
13271327

1328+
type binaryObject struct {
1329+
Name string `json:"name"`
1330+
}
1331+
1332+
func parseBinaryPackages(raw string) []string {
1333+
raw = strings.TrimSpace(raw)
1334+
if raw == "None" || len(raw) == 0 {
1335+
return nil
1336+
}
1337+
1338+
// Try JSON object array: [{"name":"pkg", ...}]
1339+
decoded := raw
1340+
if strings.HasPrefix(decoded, "\"") {
1341+
var s string
1342+
if json.Unmarshal([]byte(decoded), &s) == nil {
1343+
decoded = s
1344+
}
1345+
}
1346+
if strings.HasPrefix(decoded, "[") {
1347+
var objs []binaryObject
1348+
if json.Unmarshal([]byte(decoded), &objs) == nil && len(objs) > 0 {
1349+
var pkgs []string
1350+
for _, o := range objs {
1351+
if o.Name != "" {
1352+
pkgs = append(pkgs, o.Name)
1353+
}
1354+
}
1355+
if len(pkgs) > 0 {
1356+
return pkgs
1357+
}
1358+
}
1359+
}
1360+
1361+
// Fall back to old Python-style list: ['pkg1', 'pkg2']
1362+
str := raw
1363+
str = strings.ReplaceAll(str, "[", "")
1364+
str = strings.ReplaceAll(str, "]", "")
1365+
str = strings.ReplaceAll(str, " ", "")
1366+
str = strings.ReplaceAll(str, "'", "")
1367+
if str == "None" || len(str) == 0 {
1368+
return nil
1369+
}
1370+
return strings.Split(str, ",")
1371+
}
1372+
13281373
func saveCEVData(meta CVEMeta) {
13291374
data, err := json.Marshal(meta)
13301375
if err != nil {
@@ -1361,22 +1406,9 @@ func (m *UpdatePlatformManager) updateCVEMetaDataSync() error {
13611406
m.cveDataTime = cves.DateTime
13621407
for _, cve := range cves.Cves {
13631408
CVEs[cve.CveId] = cve
1364-
str := cve.Binary
1365-
str = strings.ReplaceAll(str, "[", "")
1366-
str = strings.ReplaceAll(str, "]", "")
1367-
str = strings.ReplaceAll(str, " ", "")
1368-
str = strings.ReplaceAll(str, "'", "")
1369-
if str == "None" || len(str) == 0 {
1370-
continue
1409+
for _, binary := range parseBinaryPackages(cve.Binary) {
1410+
m.cvePkgs[binary] = append(m.cvePkgs[binary], cve.CveId)
13711411
}
1372-
1373-
binarys := strings.Split(str, ",")
1374-
if len(binarys) > 0 {
1375-
for _, binary := range binarys {
1376-
m.cvePkgs[binary] = append(m.cvePkgs[binary], cve.CveId)
1377-
}
1378-
}
1379-
13801412
}
13811413
return nil
13821414
}

src/internal/updateplatform/message_report_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,93 @@ func assertNoIPFSLimitRate(t *testing.T, name string, limit ratelimit.IPFSLimitR
316316
}
317317
}
318318
}
319+
320+
func TestParseBinaryPackagesOldFormat(t *testing.T) {
321+
pkgs := parseBinaryPackages("['postgresql-11', 'libpq5']")
322+
if len(pkgs) != 2 || pkgs[0] != "postgresql-11" || pkgs[1] != "libpq5" {
323+
t.Fatalf("expected [postgresql-11 libpq5], got %v", pkgs)
324+
}
325+
}
326+
327+
func TestParseBinaryPackagesJSONArray(t *testing.T) {
328+
pkgs := parseBinaryPackages(`[{"name":"linux-libc-dev","version":"5.10.168-1"},{"name":"libtiff5","version":"4.1.0"}]`)
329+
if len(pkgs) != 2 || pkgs[0] != "linux-libc-dev" || pkgs[1] != "libtiff5" {
330+
t.Fatalf("expected [linux-libc-dev libtiff5], got %v", pkgs)
331+
}
332+
}
333+
334+
func TestParseBinaryPackagesStringEncodedJSON(t *testing.T) {
335+
pkgs := parseBinaryPackages(`"[{\"name\":\"libtiff5\",\"version\":\"4.1.0\"}]"`)
336+
if len(pkgs) != 1 || pkgs[0] != "libtiff5" {
337+
t.Fatalf("expected [libtiff5], got %v", pkgs)
338+
}
339+
}
340+
341+
func TestParseBinaryPackagesNone(t *testing.T) {
342+
pkgs := parseBinaryPackages("None")
343+
if len(pkgs) != 0 {
344+
t.Fatalf("expected empty, got %v", pkgs)
345+
}
346+
}
347+
348+
func TestParseBinaryPackagesEmpty(t *testing.T) {
349+
pkgs := parseBinaryPackages("")
350+
if len(pkgs) != 0 {
351+
t.Fatalf("expected empty, got %v", pkgs)
352+
}
353+
}
354+
355+
func TestGetCVEUpdateLogsIncludesNewFormatCVEs(t *testing.T) {
356+
CVEs = make(map[string]CEVInfo)
357+
manager := &UpdatePlatformManager{cvePkgs: make(map[string][]string)}
358+
cves := []CEVInfo{
359+
{SyncTime: "2026-05-02T12:04:25+08:00", CveId: "CVE-2026-31431", Binary: `[{"name":"linux-libc-dev","version":"5.10"}]`},
360+
{SyncTime: "2025-05-02T12:04:25+08:00", CveId: "CVE-2025-32728", Binary: `[{"name":"openssh-client","version":"8.2"}]`},
361+
{SyncTime: "2024-05-02T12:04:25+08:00", CveId: "CVE-2021-3677", Binary: "['libpq5']"},
362+
}
363+
for _, cve := range cves {
364+
CVEs[cve.CveId] = cve
365+
for _, binary := range parseBinaryPackages(cve.Binary) {
366+
manager.cvePkgs[binary] = append(manager.cvePkgs[binary], cve.CveId)
367+
}
368+
}
369+
370+
logs := manager.GetCVEUpdateLogs([]string{"linux-libc-dev", "openssh-client", "libpq5"})
371+
372+
if len(logs) != 3 {
373+
t.Fatalf("expected 3 CVE logs, got %d", len(logs))
374+
}
375+
if _, ok := logs["CVE-2026-31431"]; !ok {
376+
t.Fatal("expected CVE-2026-31431 in results")
377+
}
378+
if _, ok := logs["CVE-2025-32728"]; !ok {
379+
t.Fatal("expected CVE-2025-32728 in results")
380+
}
381+
if _, ok := logs["CVE-2021-3677"]; !ok {
382+
t.Fatal("expected CVE-2021-3677 in results")
383+
}
384+
}
385+
386+
func TestGetCVEUpdateLogsStringEncodedJSON(t *testing.T) {
387+
CVEs = make(map[string]CEVInfo)
388+
manager := &UpdatePlatformManager{cvePkgs: make(map[string][]string)}
389+
cves := []CEVInfo{
390+
{SyncTime: "2026-05-02T12:04:25+08:00", CveId: "CVE-2024-7006", Binary: `"[{\"name\":\"libtiff5\",\"version\":\"4.1.0\"}]"`},
391+
{SyncTime: "2024-05-02T12:04:25+08:00", CveId: "CVE-2020-19143", Binary: "['libtiff5']"},
392+
}
393+
for _, cve := range cves {
394+
CVEs[cve.CveId] = cve
395+
for _, binary := range parseBinaryPackages(cve.Binary) {
396+
manager.cvePkgs[binary] = append(manager.cvePkgs[binary], cve.CveId)
397+
}
398+
}
399+
400+
logs := manager.GetCVEUpdateLogs([]string{"libtiff5"})
401+
402+
if len(logs) != 2 {
403+
t.Fatalf("expected 2 CVE logs, got %d", len(logs))
404+
}
405+
if _, ok := logs["CVE-2024-7006"]; !ok {
406+
t.Fatal("expected CVE-2024-7006 in results")
407+
}
408+
}

0 commit comments

Comments
 (0)