From: Stephan Bosch Date: Mon, 30 Sep 2019 08:30:25 +0000 (+0200) Subject: iputils.hh: NetmaskTree: Copy the tree using tree traversal. X-Git-Tag: auth-4.3.0-beta2~20^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1355a23f8b052d759c33a0d6b0789209783fa1ca;p=thirdparty%2Fpdns.git iputils.hh: NetmaskTree: Copy the tree using tree traversal. Before, it used the internal std::set. --- diff --git a/pdns/iputils.hh b/pdns/iputils.hh index ce938c7b43..129fd578dc 100644 --- a/pdns/iputils.hh +++ b/pdns/iputils.hh @@ -834,22 +834,31 @@ private: } } + void copyTree(const NetmaskTree& rhs) + { + TreeNode *node; + + node = rhs.d_root.get(); + if (node != nullptr) + node = node->traverse_l(); + while (node != nullptr) { + if (node->assigned) + insert(node->node->first).second = node->node->second; + node = node->traverse_lnr(); + } + } + public: NetmaskTree() noexcept : d_root(new TreeNode()) { } NetmaskTree(const NetmaskTree& rhs): d_root(new TreeNode()) { - // it is easier to copy the nodes than tree. - // also acts as handy compactor - for(auto const& node: rhs._nodes) - insert(node->first).second = node->second; + copyTree(rhs); } NetmaskTree& operator=(const NetmaskTree& rhs) { clear(); - // see above. - for(auto const& node: rhs._nodes) - insert(node->first).second = node->second; + copyTree(rhs); return *this; }