sw/source/filter/ww8/docxattributeoutput.cxx | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
New commits: commit 7f5d3b0ca34678bf3555d959d0aae021e703a86e Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Fri Jun 13 17:12:14 2014 +0200 DocxAttributeOutput::WritePostponedDMLDrawing: allow recursion This method calls DocxSdrExport::writeDMLDrawing(), which may call back WriteTextBox(), which may call WritePostponedDMLDrawing() again. The result is that we try to flush drawings inside a shape which were postponed outside of it. Luckily, StartRunProperties() asserts this, so instaed of silent corruption, such an attempt crashes. Fix the crash by saving the postponed drawings on the stack, and restoring them after the shape export finished. CppunitTest_sw_ooxmlsdrexport's testAnchorIdForWP14AndW14 is a reproducer for this problem (when shape with text is imported as shape with textbox). Change-Id: Id5aeda33472655697717401c24dd54e7efabacd9 diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 62d1e05..479fe94 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4330,8 +4330,14 @@ void DocxAttributeOutput::WritePostponedDMLDrawing() if(m_postponedDMLDrawing == NULL) return; - for( std::list< PostponedDrawing >::iterator it = m_postponedDMLDrawing->begin(); - it != m_postponedDMLDrawing->end(); + // Clear the list early, this method may be called recursively. + std::list<PostponedDrawing>* postponedDMLDrawing = m_postponedDMLDrawing; + m_postponedDMLDrawing = NULL; + std::list<PostponedOLE>* postponedOLE = m_postponedOLE; + m_postponedOLE = 0; + + for( std::list< PostponedDrawing >::iterator it = postponedDMLDrawing->begin(); + it != postponedDMLDrawing->end(); ++it ) { // Avoid w:drawing within another w:drawing. @@ -4340,8 +4346,9 @@ void DocxAttributeOutput::WritePostponedDMLDrawing() else m_rExport.SdrExporter().writeDMLAndVMLDrawing(it->object, *(it->frame), *(it->point), m_anchorId++); } - delete m_postponedDMLDrawing; - m_postponedDMLDrawing = NULL; + + delete postponedDMLDrawing; + m_postponedOLE = postponedOLE; } void DocxAttributeOutput::OutputFlyFrame_Impl( const sw::Frame &rFrame, const Point& rNdTopLeft ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits