Merge pull request #1105 from travisturner/fix-diffrunarray-overflow

avoid overflow bug in differenceRunArray
This commit is contained in:
Travis Turner 2018-02-09 11:57:11 -06:00 committed by GitHub
commit 9e9a9f5ab3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 0 deletions

View file

@ -2504,6 +2504,8 @@ func differenceRunArray(a, b *container) *container {
bidx := 0
vb := b.array[bidx]
RUNLOOP:
for _, run := range a.runs {
start := run.start
for vb < run.start {
@ -2515,6 +2517,9 @@ func differenceRunArray(a, b *container) *container {
}
for vb >= run.start && vb <= run.last {
if vb == start {
if vb == 65535 { // overflow
break RUNLOOP
}
start++
bidx++
if bidx >= len(b.array) {
@ -2525,6 +2530,9 @@ func differenceRunArray(a, b *container) *container {
}
output.runs = append(output.runs, interval16{start: start, last: vb - 1})
output.n += int(vb - start)
if vb == 65535 { // overflow
break RUNLOOP
}
start = vb + 1
bidx++
if bidx >= len(b.array) {

View file

@ -1479,6 +1479,16 @@ func TestDifferenceRunArray(t *testing.T) {
array: []uint16{0, 9, 10, 11, 12, 13, 14, 17, 19, 25, 27},
exp: []interval16{{start: 1, last: 8}, {start: 15, last: 16}, {start: 20, last: 24}, {start: 26, last: 26}, {start: 28, last: 28}},
},
{
runs: []interval16{{start: 0, last: 20}, {start: 65533, last: 65535}},
array: []uint16{65533, 65534, 65535},
exp: []interval16{{start: 0, last: 20}},
},
{
runs: []interval16{{start: 0, last: 20}, {start: 65530, last: 65535}},
array: []uint16{37, 65535},
exp: []interval16{{start: 0, last: 20}, {start: 65530, last: 65534}},
},
}
for i, test := range tests {
a.runs = test.runs