Skip to content

Commit 0ec945d

Browse files
authored
fix(scanner/redhatbase): support for empty release in rpm -qa (#2101)
1 parent d3bf2a6 commit 0ec945d

File tree

2 files changed

+182
-89
lines changed

2 files changed

+182
-89
lines changed

scanner/redhatbase.go

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ func (o *redhatBase) parseInstalledPackages(stdout string) (models.Packages, mod
523523
case constant.Amazon:
524524
switch strings.Fields(o.getDistro().Release)[0] {
525525
case "2":
526-
switch len(strings.Fields(line)) {
526+
switch len(strings.Split(line, " ")) {
527527
case 6:
528528
binpkg, srcpkg, err = o.parseInstalledPackagesLine(line)
529529
case 7:
@@ -575,7 +575,7 @@ func (o *redhatBase) parseInstalledPackages(stdout string) (models.Packages, mod
575575
}
576576

577577
func (o *redhatBase) parseInstalledPackagesLine(line string) (*models.Package, *models.SrcPackage, error) {
578-
switch fields := strings.Fields(line); len(fields) {
578+
switch fields := strings.Split(line, " "); len(fields) {
579579
case 6, 7:
580580
sp, err := func() (*models.SrcPackage, error) {
581581
switch fields[5] {
@@ -592,8 +592,14 @@ func (o *redhatBase) parseInstalledPackagesLine(line string) (*models.Package, *
592592
Version: func() string {
593593
switch fields[1] {
594594
case "0", "(none)":
595+
if r == "" {
596+
return v
597+
}
595598
return fmt.Sprintf("%s-%s", v, r)
596599
default:
600+
if r == "" {
601+
return fmt.Sprintf("%s:%s", fields[1], v)
602+
}
597603
return fmt.Sprintf("%s:%s-%s", fields[1], v, r)
598604
}
599605
}(),
@@ -631,7 +637,7 @@ func (o *redhatBase) parseInstalledPackagesLine(line string) (*models.Package, *
631637
}
632638

633639
func (o *redhatBase) parseInstalledPackagesLineFromRepoquery(line string) (*models.Package, *models.SrcPackage, error) {
634-
switch fields := strings.Fields(line); len(fields) {
640+
switch fields := strings.Split(line, " "); len(fields) {
635641
case 7:
636642
sp, err := func() (*models.SrcPackage, error) {
637643
switch fields[5] {
@@ -648,8 +654,14 @@ func (o *redhatBase) parseInstalledPackagesLineFromRepoquery(line string) (*mode
648654
Version: func() string {
649655
switch fields[1] {
650656
case "0", "(none)":
657+
if r == "" {
658+
return v
659+
}
651660
return fmt.Sprintf("%s-%s", v, r)
652661
default:
662+
if r == "" {
663+
return fmt.Sprintf("%s:%s", fields[1], v)
664+
}
653665
return fmt.Sprintf("%s:%s-%s", fields[1], v, r)
654666
}
655667
}(),
@@ -699,20 +711,27 @@ func splitFileName(filename string) (name, ver, rel, epoch, arch string, err err
699711
basename := strings.TrimSuffix(filename, ".rpm")
700712

701713
archIndex := strings.LastIndex(basename, ".")
714+
// support not standard style rpm fullname
715+
// e.g.
716+
// baz-0-1-i386 => i386
717+
// qux-0--i386 => i386
718+
if i := strings.LastIndex(basename[archIndex+1:], "-"); i > -1 {
719+
archIndex = archIndex + (i + 1)
720+
}
702721
if archIndex == -1 {
703-
return "", "", "", "", "", xerrors.Errorf("unexpected file name. expected: %q, actual: %q", "<name>-<version>-<release>.<arch>.rpm", fmt.Sprintf("%s.rpm", filename))
722+
return "", "", "", "", "", xerrors.Errorf("unexpected file name. expected: %q, actual: %q", "(<epoch>:)<name>-<version>-(<release>)(.|-)<arch>.rpm", filename)
704723
}
705724
arch = basename[archIndex+1:]
706725

707726
relIndex := strings.LastIndex(basename[:archIndex], "-")
708727
if relIndex == -1 {
709-
return "", "", "", "", "", xerrors.Errorf("unexpected file name. expected: %q, actual: %q", "<name>-<version>-<release>.<arch>.rpm", fmt.Sprintf("%s.rpm", filename))
728+
return "", "", "", "", "", xerrors.Errorf("unexpected file name. expected: %q, actual: %q", "(<epoch>:)<name>-<version>-(<release>)(.|-)<arch>.rpm", filename)
710729
}
711730
rel = basename[relIndex+1 : archIndex]
712731

713732
verIndex := strings.LastIndex(basename[:relIndex], "-")
714733
if verIndex == -1 {
715-
return "", "", "", "", "", xerrors.Errorf("unexpected file name. expected: %q, actual: %q", "<name>-<version>-<release>.<arch>.rpm", fmt.Sprintf("%s.rpm", filename))
734+
return "", "", "", "", "", xerrors.Errorf("unexpected file name. expected: %q, actual: %q", "(<epoch>:)<name>-<version>-(<release>)(.|-)<arch>.rpm", filename)
716735
}
717736
ver = basename[verIndex+1 : relIndex]
718737

@@ -787,7 +806,7 @@ func (o *redhatBase) parseUpdatablePacksLines(stdout string) (models.Packages, e
787806
}
788807

789808
func (o *redhatBase) parseUpdatablePacksLine(line string) (models.Package, error) {
790-
fields := strings.Fields(line)
809+
fields := strings.Split(line, " ")
791810
if len(fields) < 5 {
792811
return models.Package{}, xerrors.Errorf("Unknown format: %s, fields: %s", line, fields)
793812
}

0 commit comments

Comments
 (0)