From ac4010bce0951c60ffe1f648d830a9dfa0d0a6b9 Mon Sep 17 00:00:00 2001 From: Travis Turner Date: Fri, 9 Feb 2018 11:35:13 -0600 Subject: [PATCH] avoid overflow bug in differenceRunArray which was appending a full run to the container --- roaring/roaring.go | 8 ++++++++ roaring/roaring_internal_test.go | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/roaring/roaring.go b/roaring/roaring.go index a685e479c..efdce69a0 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -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) { diff --git a/roaring/roaring_internal_test.go b/roaring/roaring_internal_test.go index a2fbb7d64..f79f53053 100644 --- a/roaring/roaring_internal_test.go +++ b/roaring/roaring_internal_test.go @@ -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