diff options
-rw-r--r-- | editeng/source/rtf/svxrtf.cxx | 48 | ||||
-rw-r--r-- | include/editeng/svxrtf.hxx | 4 |
2 files changed, 15 insertions, 37 deletions
diff --git a/editeng/source/rtf/svxrtf.cxx b/editeng/source/rtf/svxrtf.cxx index 7c1d885323e3..17ef94553ec5 100644 --- a/editeng/source/rtf/svxrtf.cxx +++ b/editeng/source/rtf/svxrtf.cxx @@ -848,42 +848,14 @@ void SvxRTFParser::SetAllAttrOfStk() // end all Attr. and set it into doc for (size_t n = m_AttrSetList.size(); n; ) { auto const& pStkSet = m_AttrSetList[--n]; - - /* - ofz#29461 SetAttrSet recursively calls SetAttrSet on pStkSet's - m_pChildList. The recurse depth can grow sufficiently to trigger - asan. - - So breadth-first iterate through the nodes and make a flat vector of - them which can be iterated through linearly - */ - auto bfs = pStkSet->GetBreadthFirstList(); - for (auto it = bfs.begin(); it != bfs.end(); ++it) - { - SvxRTFItemStackType* pNode = *it; - SetAttrSet(*pNode, false); - } - - /* - ofz#13491 SvxRTFItemStackType dtor recursively calls the dtor of its - m_pChildList. The recurse depth can grow sufficiently to trigger - asan. - - iterate through flat-view of those nodes in order of most distant - from root first and release them linearly - */ - for (auto it = bfs.rbegin(); it != bfs.rend(); ++it) - { - SvxRTFItemStackType* pNode = *it; - pNode->m_pChildList.reset(); - } - + SetAttrSet( *pStkSet ); + pStkSet->DropChildList(); m_AttrSetList.pop_back(); } } // sets all the attributes that are different from the current -void SvxRTFParser::SetAttrSet(SvxRTFItemStackType &rSet, bool bRecurse) +void SvxRTFParser::SetAttrSet( SvxRTFItemStackType &rSet ) { // Was DefTab never read? then set to default if( !bIsSetDfltTab ) @@ -895,7 +867,7 @@ void SvxRTFParser::SetAttrSet(SvxRTFItemStackType &rSet, bool bRecurse) SetAttrInDoc( rSet ); // then process all the children - if (bRecurse && rSet.m_pChildList) + if (rSet.m_pChildList) for (size_t n = 0; n < rSet.m_pChildList->size(); ++n) SetAttrSet( *(*rSet.m_pChildList)[ n ] ); } @@ -991,10 +963,12 @@ SvxRTFItemStackType::SvxRTFItemStackType( distant from root first and release their children linearly */ -std::vector<SvxRTFItemStackType*> SvxRTFItemStackType::GetBreadthFirstList() +void SvxRTFItemStackType::DropChildList() { - std::vector<SvxRTFItemStackType*> bfs; + if (!m_pChildList || m_pChildList->empty()) + return; + std::vector<SvxRTFItemStackType*> bfs; std::queue<SvxRTFItemStackType*> aQueue; aQueue.push(this); @@ -1010,7 +984,11 @@ std::vector<SvxRTFItemStackType*> SvxRTFItemStackType::GetBreadthFirstList() } } - return bfs; + for (auto it = bfs.rbegin(); it != bfs.rend(); ++it) + { + SvxRTFItemStackType* pNode = *it; + pNode->m_pChildList.reset(); + } } SvxRTFItemStackType::~SvxRTFItemStackType() diff --git a/include/editeng/svxrtf.hxx b/include/editeng/svxrtf.hxx index 70e996068459..faff107c1496 100644 --- a/include/editeng/svxrtf.hxx +++ b/include/editeng/svxrtf.hxx @@ -197,7 +197,7 @@ class EDITENG_DLLPUBLIC SvxRTFParser : public SvRTFParser void ClearStyleAttr_( SvxRTFItemStackType& rStkType ); // Sets all the attributes that are different from the current - void SetAttrSet(SvxRTFItemStackType &rSet, bool bRecurse = true); + void SetAttrSet( SvxRTFItemStackType &rSet ); void SetDefault( int nToken, int nValue ); // Execute pard / plain @@ -309,7 +309,7 @@ class SvxRTFItemStackType void Add(std::unique_ptr<SvxRTFItemStackType>); void Compress( const SvxRTFParser& ); - std::vector<SvxRTFItemStackType*> GetBreadthFirstList(); + void DropChildList(); public: SvxRTFItemStackType(const SvxRTFItemStackType&, const EditPosition&, |