From 6b27ae6138a1e924a39806bc1de75ef91c30a5c6 Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Tue, 3 Oct 2023 09:41:13 +0000 Subject: Prevent eternal loop if bit vectors are shorter than docid limit --- searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp | 4 ++-- searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'searchlib/src/vespa') diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp index 6408004ea32..563a88e860f 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp @@ -66,7 +66,7 @@ bool MultiBitVector::updateLastValue(uint32_t docId) noexcept { if (docId >= _lastMaxDocIdLimit) { - if (__builtin_expect(docId >= _numDocs, false)) { + if (__builtin_expect(isAtEnd(docId), false)) { return true; } const uint32_t index(BitWord::wordNum(docId)); @@ -147,7 +147,7 @@ public: private: void doSeek(uint32_t docId) override { docId = this->_mbv.strictSeek(docId); - if (__builtin_expect(docId >= this->getEndId(), false)) { + if (__builtin_expect(this->_mbv.isAtEnd(docId), false)) { this->setAtEnd(); } else { this->setDocId(docId); diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h index 5c3d17c6786..855ecfae60c 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h @@ -19,6 +19,7 @@ public: _lastMaxDocIdLimit = 0; _lastMaxDocIdLimitRequireFetch = 0; } + bool isAtEnd(uint32_t docId) const noexcept { return docId >= _numDocs; } void addBitVector(Meta bv, uint32_t docIdLimit); protected: uint32_t _numDocs; -- cgit v1.2.3