aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2021-03-31 14:42:16 +0200
committerTor Egge <Tor.Egge@broadpark.no>2021-03-31 14:43:50 +0200
commit4934646fe27a1200332fa9952e3a5f4e3f049f58 (patch)
tree7d19f569c15a216c6f1c80f3d0b97137847d9633
parente672b5b73d0d8c74300859a7ffc7206f62efbaf0 (diff)
Avoid null pointer dereference.
-rw-r--r--searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp2
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeroot.h15
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeroot.hpp23
3 files changed, 25 insertions, 15 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp b/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp
index b7517094b19..f270b78f84f 100644
--- a/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/postinglistsearchcontext.cpp
@@ -19,7 +19,7 @@ PostingListSearchContext(const IEnumStoreDictionary& dictionary,
bool useBitVector,
const ISearchContext &baseSearchCtx)
: _dictionary(dictionary),
- _frozenDictionary(_dictionary.get_has_btree_dictionary() ? _dictionary.get_posting_dictionary().getFrozenView() : FrozenDictionary(EnumIndex(), *((Dictionary::NodeAllocatorType *) 0))),
+ _frozenDictionary(_dictionary.get_has_btree_dictionary() ? _dictionary.get_posting_dictionary().getFrozenView() : FrozenDictionary()),
_lowerDictItr(BTreeNode::Ref(), _frozenDictionary.getAllocator()),
_upperDictItr(BTreeNode::Ref(), _frozenDictionary.getAllocator()),
_uniqueValues(0u),
diff --git a/vespalib/src/vespa/vespalib/btree/btreeroot.h b/vespalib/src/vespa/vespalib/btree/btreeroot.h
index 60eeb98e5a5..dc3507fc5d5 100644
--- a/vespalib/src/vespa/vespalib/btree/btreeroot.h
+++ b/vespalib/src/vespa/vespalib/btree/btreeroot.h
@@ -61,9 +61,10 @@ public:
class FrozenView {
private:
BTreeNode::Ref _frozenRoot;
- const NodeAllocatorType & _allocator;
+ const NodeAllocatorType *const _allocator;
public:
typedef ConstIterator Iterator;
+ FrozenView();
FrozenView(BTreeNode::Ref frozenRoot,
const NodeAllocatorType & allocator);
ConstIterator find(const KeyType& key,
@@ -73,30 +74,30 @@ public:
ConstIterator upperBound(const KeyType &key,
CompareT comp = CompareT()) const;
ConstIterator begin() const {
- return ConstIterator(_frozenRoot, _allocator);
+ return ConstIterator(_frozenRoot, *_allocator);
}
void begin(std::vector<ConstIterator> &where) const {
- where.emplace_back(_frozenRoot, _allocator);
+ where.emplace_back(_frozenRoot, *_allocator);
}
BTreeNode::Ref getRoot() const { return _frozenRoot; }
size_t size() const;
- const NodeAllocatorType &getAllocator() const { return _allocator; }
+ const NodeAllocatorType &getAllocator() const { return *_allocator; }
const AggrT &getAggregated() const {
- return _allocator.getAggregated(_frozenRoot);
+ return _allocator->getAggregated(_frozenRoot);
}
bool empty() const { return !_frozenRoot.valid(); }
template <typename FunctionType>
void foreach_key(FunctionType func) const {
- _allocator.getNodeStore().foreach_key(_frozenRoot, func);
+ _allocator->getNodeStore().foreach_key(_frozenRoot, func);
}
template <typename FunctionType>
void foreach(FunctionType func) const {
- _allocator.getNodeStore().foreach(_frozenRoot, func);
+ _allocator->getNodeStore().foreach(_frozenRoot, func);
}
};
diff --git a/vespalib/src/vespa/vespalib/btree/btreeroot.hpp b/vespalib/src/vespa/vespalib/btree/btreeroot.hpp
index dd271a16203..3cfd1cb49ea 100644
--- a/vespalib/src/vespa/vespalib/btree/btreeroot.hpp
+++ b/vespalib/src/vespa/vespalib/btree/btreeroot.hpp
@@ -170,10 +170,19 @@ upperBoundHelper(BTreeNode::Ref root, const KeyType & key,
template <typename KeyT, typename DataT, typename AggrT, typename CompareT,
typename TraitsT>
BTreeRootT<KeyT, DataT, AggrT, CompareT, TraitsT>::
+FrozenView::FrozenView()
+ : _frozenRoot(BTreeNode::Ref()),
+ _allocator(nullptr)
+{
+}
+
+template <typename KeyT, typename DataT, typename AggrT, typename CompareT,
+ typename TraitsT>
+BTreeRootT<KeyT, DataT, AggrT, CompareT, TraitsT>::
FrozenView::FrozenView(BTreeNode::Ref frozenRoot,
- const NodeAllocatorType & allocator) :
- _frozenRoot(frozenRoot),
- _allocator(allocator)
+ const NodeAllocatorType & allocator)
+ : _frozenRoot(frozenRoot),
+ _allocator(&allocator)
{
}
@@ -184,7 +193,7 @@ BTreeRootT<KeyT, DataT, AggrT, CompareT, TraitsT>::
FrozenView::find(const KeyType & key,
CompareT comp) const
{
- ConstIterator itr(BTreeNode::Ref(), _allocator);
+ ConstIterator itr(BTreeNode::Ref(), *_allocator);
itr.lower_bound(_frozenRoot, key, comp);
if (itr.valid() && comp(key, itr.getKey())) {
itr.setupEnd();
@@ -199,7 +208,7 @@ BTreeRootT<KeyT, DataT, AggrT, CompareT, TraitsT>::
FrozenView::lowerBound(const KeyType & key,
CompareT comp) const
{
- ConstIterator itr(BTreeNode::Ref(), _allocator);
+ ConstIterator itr(BTreeNode::Ref(), *_allocator);
itr.lower_bound(_frozenRoot, key, comp);
return itr;
}
@@ -211,7 +220,7 @@ BTreeRootT<KeyT, DataT, AggrT, CompareT, TraitsT>::
FrozenView::upperBound(const KeyType & key,
CompareT comp) const
{
- ConstIterator itr(_frozenRoot, _allocator);
+ ConstIterator itr(_frozenRoot, *_allocator);
if (itr.valid() && !comp(key, itr.getKey())) {
itr.seekPast(key, comp);
}
@@ -225,7 +234,7 @@ BTreeRootT<KeyT, DataT, AggrT, CompareT, TraitsT>::
FrozenView::size() const
{
if (NodeAllocatorType::isValidRef(_frozenRoot)) {
- return _allocator.validLeaves(_frozenRoot);
+ return _allocator->validLeaves(_frozenRoot);
}
return 0u;
}