Skip to content

Commit e02deb9

Browse files
authored
Fix versionInRange for multi-interval OSV ranges (#18)
When an OSV range has multiple introduced/fixed intervals, a later introduced event would overwrite inRange to false even when the version was already matched by an earlier interval. Now introduced events can only set inRange to true, never reset it to false.
1 parent f1d54c2 commit e02deb9

2 files changed

Lines changed: 66 additions & 1 deletion

File tree

affected.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ func versionInRange(events []Event, version string) bool {
2828
inRange := false
2929
for _, e := range events {
3030
if e.Introduced != "" {
31-
inRange = e.Introduced == "0" || vers.Compare(version, e.Introduced) >= 0
31+
if e.Introduced == "0" || vers.Compare(version, e.Introduced) >= 0 {
32+
inRange = true
33+
}
3234
}
3335
if e.Fixed != "" && inRange && vers.Compare(version, e.Fixed) >= 0 {
3436
inRange = false

affected_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,3 +113,66 @@ func TestAffectedVersionRange(t *testing.T) {
113113
})
114114
}
115115
}
116+
117+
func TestVersionInRangeMultiInterval(t *testing.T) {
118+
events := []Event{
119+
{Introduced: "0"},
120+
{Fixed: "1.0.0"},
121+
{Introduced: "2.0.0"},
122+
{Fixed: "3.0.0"},
123+
}
124+
125+
tests := []struct {
126+
version string
127+
want bool
128+
}{
129+
{"0.5.0", true},
130+
{"1.0.0", false},
131+
{"1.5.0", false},
132+
{"2.0.0", true},
133+
{"2.5.0", true},
134+
{"3.0.0", false},
135+
{"4.0.0", false},
136+
}
137+
138+
for _, tt := range tests {
139+
t.Run(tt.version, func(t *testing.T) {
140+
got := versionInRange(events, tt.version)
141+
if got != tt.want {
142+
t.Errorf("versionInRange(%q) = %v, want %v", tt.version, got, tt.want)
143+
}
144+
})
145+
}
146+
}
147+
148+
func TestVersionInRangeMultiIntervalLastAffected(t *testing.T) {
149+
events := []Event{
150+
{Introduced: "1.0.0"},
151+
{LastAffected: "1.9.0"},
152+
{Introduced: "3.0.0"},
153+
{LastAffected: "3.9.0"},
154+
}
155+
156+
tests := []struct {
157+
version string
158+
want bool
159+
}{
160+
{"0.5.0", false},
161+
{"1.0.0", true},
162+
{"1.5.0", true},
163+
{"1.9.0", true},
164+
{"2.0.0", false},
165+
{"3.0.0", true},
166+
{"3.9.0", true},
167+
{"4.0.0", false},
168+
}
169+
170+
for _, tt := range tests {
171+
t.Run(tt.version, func(t *testing.T) {
172+
got := versionInRange(events, tt.version)
173+
if got != tt.want {
174+
t.Errorf("versionInRange(%q) = %v, want %v", tt.version, got, tt.want)
175+
}
176+
})
177+
}
178+
}

0 commit comments

Comments
 (0)