| // Copyright 2023 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package osvutils | |
| import ( | |
| "fmt" | |
| "golang.org/x/vulndb/internal/osv" | |
| "golang.org/x/vulndb/internal/version" | |
| ) | |
| // AffectsSemver returns whether the version v is within the given ranges. | |
| // v must be unprefixed, valid semver, and ranges must be sorted, | |
| // non-overlapping, and contain only valid semver. | |
| // The function errors if either of the inputs is invalid. | |
| func AffectsSemver(ranges []osv.Range, v string) (bool, error) { | |
| // Check that ranges are sorted and otherwise valid. | |
| if err := ValidateRanges(ranges); err != nil { | |
| return false, err | |
| } | |
| if !version.IsValid(v) { | |
| return false, fmt.Errorf("%w: %s", errInvalidSemver, v) | |
| } | |
| for _, r := range ranges { | |
| if containsSemver(r, v) { | |
| return true, nil | |
| } | |
| } | |
| return false, nil | |
| } | |
| // containsSemver checks if semver version v is in the | |
| // range encoded by ar. | |
| // The range must be sorted in ascending order. | |
| func containsSemver(ar osv.Range, v string) bool { | |
| var affected bool | |
| for _, e := range ar.Events { | |
| if !affected && e.Introduced != "" { | |
| affected = e.Introduced == "0" || !version.Before(v, e.Introduced) | |
| } else if affected && e.Fixed != "" { | |
| affected = version.Before(v, e.Fixed) | |
| } | |
| } | |
| return affected | |
| } |