ext/vulnsrc/oracle: fix ELSA version comparison
Previously we naively compared integers. However, not all versions have the same length.
This commit is contained in:
parent
8dbd4f3947
commit
bcf47f53ee
@ -85,6 +85,36 @@ func init() {
|
|||||||
vulnsrc.RegisterUpdater("oracle", &updater{})
|
vulnsrc.RegisterUpdater("oracle", &updater{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func compareELSA(left, right int) int {
|
||||||
|
// Fast path equals.
|
||||||
|
if right == left {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
lstr := strconv.Itoa(left)
|
||||||
|
rstr := strconv.Itoa(right)
|
||||||
|
|
||||||
|
for i := range lstr {
|
||||||
|
// If right is too short to be indexed, left is greater.
|
||||||
|
if i >= len(rstr) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
ldigit, _ := strconv.Atoi(string(lstr[i]))
|
||||||
|
rdigit, _ := strconv.Atoi(string(rstr[i]))
|
||||||
|
|
||||||
|
if ldigit > rdigit {
|
||||||
|
return 1
|
||||||
|
} else if ldigit < rdigit {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Everything the length of left is the same.
|
||||||
|
return len(lstr) - len(rstr)
|
||||||
|
}
|
||||||
|
|
||||||
func (u *updater) Update(datastore database.Datastore) (resp vulnsrc.UpdateResponse, err error) {
|
func (u *updater) Update(datastore database.Datastore) (resp vulnsrc.UpdateResponse, err error) {
|
||||||
log.Info("fetching Oracle Linux vulnerabilities")
|
log.Info("fetching Oracle Linux vulnerabilities")
|
||||||
|
|
||||||
@ -115,7 +145,7 @@ func (u *updater) Update(datastore database.Datastore) (resp vulnsrc.UpdateRespo
|
|||||||
r := elsaRegexp.FindStringSubmatch(line)
|
r := elsaRegexp.FindStringSubmatch(line)
|
||||||
if len(r) == 2 {
|
if len(r) == 2 {
|
||||||
elsaNo, _ := strconv.Atoi(r[1])
|
elsaNo, _ := strconv.Atoi(r[1])
|
||||||
if elsaNo > firstELSA {
|
if compareELSA(elsaNo, firstELSA) > 0 {
|
||||||
elsaList = append(elsaList, elsaNo)
|
elsaList = append(elsaList, elsaNo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,3 +115,23 @@ func TestOracleParser(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestELSAComparison(t *testing.T) {
|
||||||
|
var table = []struct {
|
||||||
|
left int
|
||||||
|
right int
|
||||||
|
expected int
|
||||||
|
}{
|
||||||
|
{20170935, 20170935, 0},
|
||||||
|
{20170934, 20170935, -1},
|
||||||
|
{20170936, 20170935, 1},
|
||||||
|
|
||||||
|
{20170935, 201709331, 1},
|
||||||
|
{201709351, 20170935, 1},
|
||||||
|
{201709331, 20170935, -1},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range table {
|
||||||
|
assert.Equal(t, tt.expected, compareELSA(tt.left, tt.right))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user