mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-09-07 09:05:55 +00:00
Merge pull request #1105 from travisturner/fix-diffrunarray-overflow
avoid overflow bug in differenceRunArray
This commit is contained in:
commit
9e9a9f5ab3
2 changed files with 18 additions and 0 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue