diff options
author | Tor Egge <Tor.Egge@broadpark.no> | 2021-03-31 14:42:16 +0200 |
---|---|---|
committer | Tor Egge <Tor.Egge@broadpark.no> | 2021-03-31 14:43:50 +0200 |
commit | 4934646fe27a1200332fa9952e3a5f4e3f049f58 (patch) | |
tree | 7d19f569c15a216c6f1c80f3d0b97137847d9633 /vespalib | |
parent | e672b5b73d0d8c74300859a7ffc7206f62efbaf0 (diff) |
Avoid null pointer dereference.
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeroot.h | 15 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeroot.hpp | 23 |
2 files changed, 24 insertions, 14 deletions
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; } |