From cf372cdd1d08158201c1e24c9857f8a6a2c2c028 Mon Sep 17 00:00:00 2001 From: Travis Date: Mon, 21 Aug 2017 14:20:37 -0500 Subject: [PATCH] Fix infinite loop in bitmap-to-array conversion. When a run ended the container (i.e. contained column 65535), then the for loop would increment the 16-bit value to 0, at which point it was still <= 65535. --- roaring/roaring.go | 4 ++++ roaring/roaring_internal_test.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index 16e6159d7..06533d5c0 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -1992,6 +1992,10 @@ func intersectBitmapRun(a, b *container) *container { if a.bitmapContains(i) { output.array = append(output.array, i) } + // If the run ends the container, break to avoid an infinite loop. + if i == 65535 { + break + } } } output.n = len(output.array) diff --git a/roaring/roaring_internal_test.go b/roaring/roaring_internal_test.go index 9cc2f2aa7..21a14c3eb 100644 --- a/roaring/roaring_internal_test.go +++ b/roaring/roaring_internal_test.go @@ -623,7 +623,7 @@ func TestIntersectBitmapRunArray(t *testing.T) { }, { bitmap: []uint64{0xFFFFFFFFFFFFFFFF, 1, 1, 1, 0xA, 1, 1, 0, 1}, - runs: []interval16{{start: 63, last: 10000}}, + runs: []interval16{{start: 63, last: 10000}, {start: 65000, last: 65535}}, exp: []uint16{63, 64, 128, 192, 257, 259, 320, 384, 512}, expN: 9, },