[Libreoffice-commits] .: Branch 'libreoffice-4-0' - sw/qa writerfilter/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Dec 31 06:16:14 PST 2012


 sw/qa/extras/rtfimport/data/fdo54612.rtf       |   34 +++++++++++++++++++++++++
 sw/qa/extras/rtfimport/rtfimport.cxx           |   10 +++++++
 writerfilter/source/rtftok/rtfdocumentimpl.cxx |   17 ++++++++----
 3 files changed, 55 insertions(+), 6 deletions(-)

New commits:
commit 810fc6553c73634aa4c64be9c2ae83112493d81c
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Sun Dec 30 22:55:20 2012 +0100

    fdo#54612 don't crash on RTF_DPPTX before RTF_DPPOLYCOUNT
    
    Change-Id: I35bf580df157dee429d9dca193945ea95616d678
    (cherry picked from commit 08b4efb4e1cd01311719caffea4117fd8770f20f)

diff --git a/sw/qa/extras/rtfimport/data/fdo54612.rtf b/sw/qa/extras/rtfimport/data/fdo54612.rtf
new file mode 100644
index 0000000..3867d0e
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/fdo54612.rtf
@@ -0,0 +1,34 @@
+{\rtf 
+{\do\dobxpage\dobypage\dptxbx\dptxbxmar0 
+{\dptxbxtext\plain 
+\par}
+\dpx720\dpy1305\dpxsize10005\dpysize2910\dplinehollow0
+\dpfillpat0}
+{\do\dobxpage\dobypage\dpline\dpptx0\dppty0\dpptx9870\dppty0\dpx735\dpy4830
+\dpxsize9870\dpysize0\dplinesolid0\dplinecor0\dplinecog128\dplinecob128
+\dplinew30}
+{\do\dobxpage\dobypage\dptxbx\dptxbxmar0 
+{\dptxbxtext\plain\f1\fs36\b\ul 
+\par}
+\dpx4605\dpy4935\dpxsize2640\dpysize435\dplinehollow0\dpfillpat0
+}
+{\do\dobxpage\dobypage\dpline\dpptx0\dppty0\dpptx9870\dppty0\dpx735\dpy5550
+\dpxsize9870\dpysize0\dplinesolid0\dplinecor0\dplinecog128\dplinecob128
+\dplinew30}
+{\do\dobxpage\dobypage\dptxbx\dptxbxmar0 
+{\dptxbxtext\plain\f1\fs19\b 
+\par}
+\dpx3555\dpy5910\dpxsize2235\dpysize240\dplinehollow0
+\dpfillpat0}
+{\do\dobxpage\dobypage\dptxbx\dptxbxmar0 
+{\dptxbxtext\plain\f1\fs19\b 
+\par}
+\dpx3900\dpy6195\dpxsize1995\dpysize240\dplinehollow0
+\dpfillpat0}
+{\do\dobxpage\dobypage\dptxbx\dptxbxmar0 
+{\dptxbxtext\plain\f1\fs19
+\par}
+\dpx5835\dpy6195\dpxsize1245\dpysize240\dplinehollow0\dpfillpat0}
+{\do\dobxpage\dobypage\dpline\dpptx0\dppty0\dpptx3480\dppty0\dpx6720\dpy6765
+\dpxsize3480\dpysize0\dplinesolid0\dplinecor0\dplinecog0\dplinecob0\dplinew0}
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 8de1922..367df3e 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -133,6 +133,7 @@ public:
     void testFdo58076();
     void testFdo57678();
     void testFdo45183();
+    void testFdo54612();
 
     CPPUNIT_TEST_SUITE(Test);
 #if !defined(MACOSX) && !defined(WNT)
@@ -216,6 +217,7 @@ void Test::run()
         {"fdo58076.rtf", &Test::testFdo58076},
         {"fdo57678.rtf", &Test::testFdo57678},
         {"fdo45183.rtf", &Test::testFdo45183},
+        {"fdo54612.rtf", &Test::testFdo54612},
     };
     for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
     {
@@ -1003,6 +1005,14 @@ void Test::testFdo45183()
     CPPUNIT_ASSERT_EQUAL(sal_Int32(16237), getProperty<sal_Int32>(xTables->getByIndex(0), "Width"));
 }
 
+void Test::testFdo54612()
+{
+    // \dpptx without a \dppolycount caused a crash.
+    uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(8), xDraws->getCount());
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Test);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 378e9f5..9ac2282 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -3314,19 +3314,24 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam)
         case RTF_DPPTX:
             {
                 RTFDrawingObject& rDrawingObject = m_aStates.top().aDrawingObject;
+                if (!rDrawingObject.aPolyLinePoints.hasElements())
+                    dispatchValue(RTF_DPPOLYCOUNT, 2);
                 rDrawingObject.aPolyLinePoints[rDrawingObject.aPolyLinePoints.getLength() - rDrawingObject.nPolyLineCount].X = TWIP_TO_MM100(nParam);
             }
             break;
         case RTF_DPPTY:
             {
                 RTFDrawingObject& rDrawingObject = m_aStates.top().aDrawingObject;
-                rDrawingObject.aPolyLinePoints[rDrawingObject.aPolyLinePoints.getLength() - rDrawingObject.nPolyLineCount].Y = TWIP_TO_MM100(nParam);
-                rDrawingObject.nPolyLineCount--;
-                if (rDrawingObject.nPolyLineCount == 0)
+                if (rDrawingObject.aPolyLinePoints.hasElements())
                 {
-                    uno::Sequence< uno::Sequence<awt::Point> >aPointSequenceSequence(1);
-                    aPointSequenceSequence[0] = rDrawingObject.aPolyLinePoints;
-                    rDrawingObject.xPropertySet->setPropertyValue("PolyPolygon", uno::Any(aPointSequenceSequence));
+                    rDrawingObject.aPolyLinePoints[rDrawingObject.aPolyLinePoints.getLength() - rDrawingObject.nPolyLineCount].Y = TWIP_TO_MM100(nParam);
+                    rDrawingObject.nPolyLineCount--;
+                    if (rDrawingObject.nPolyLineCount == 0)
+                    {
+                        uno::Sequence< uno::Sequence<awt::Point> >aPointSequenceSequence(1);
+                        aPointSequenceSequence[0] = rDrawingObject.aPolyLinePoints;
+                        rDrawingObject.xPropertySet->setPropertyValue("PolyPolygon", uno::Any(aPointSequenceSequence));
+                    }
                 }
             }
             break;


More information about the Libreoffice-commits mailing list