Blob Blame History Raw
From 97de5b728dd336b887ec0d36ab4f01537e26bec6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Wed, 11 Nov 2015 13:34:43 +0000
Subject: [PATCH] Incredible slowness and crashes with document with vast num
 of frame dups

it looks like draw:name values are supposed to be unique in ODF, even
if it's not spelled out explicitly, since it exists so the frame can be
referenced, which sort of implies that it has to be unique, so a
document where the values aren't unique can be considered invalid

    19.197.10 <draw:frame>
    The draw:name attribute specifies a name by which a <draw:frame>
element can be referenced.

So reject duplicate frames but limit this to document generated with
4.4.X which we believe is the version that created these bogus docs

(cherry picked from commit de0432a9256188c7b5cd1a83858311e68c890ebf)

Change-Id: I83f6d72fd969f667f0a8c2c85d2ffeeed672387a

xmloff: add meta:generator constants LO_43x and LO_44x

Change-Id: I1d962ad637f19b02855616edebcedbad719689c5
(cherry picked from commit ee655627ad2ba66a8160b4cbdaeb1dd52d047a1d)
---
 include/xmloff/xmlimp.hxx                  |  6 ++++--
 xmloff/source/core/xmlimp.cxx              | 21 ++++++++++++++-------
 xmloff/source/text/XMLTextFrameContext.cxx | 10 +++++++++-
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/include/xmloff/xmlimp.hxx b/include/xmloff/xmlimp.hxx
index 2939f6e..82949d3 100644
--- a/include/xmloff/xmlimp.hxx
+++ b/include/xmloff/xmlimp.hxx
@@ -480,9 +480,11 @@ public:
     static const sal_uInt16 LO_3x = 30 | LO_flag;
     static const sal_uInt16 LO_41x = 41 | LO_flag;
     static const sal_uInt16 LO_42x = 42 | LO_flag;
-    /// @ATTENTION: when adding a new value more specific than "4x", grep for
+    static const sal_uInt16 LO_43x = 43 | LO_flag;
+    static const sal_uInt16 LO_44x = 44 | LO_flag;
+    /// @ATTENTION: when adding a new value more specific than "5x", grep for
     /// all current uses and adapt them!!!
-    static const sal_uInt16 LO_4x = 43 | LO_flag;
+    static const sal_uInt16 LO_5x = 50 | LO_flag;
     static const sal_uInt16 ProductVersionUnknown = SAL_MAX_UINT16;
 
     /** depending on whether the generator version indicates LO, compare
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx
index 339e5dd..46fdae8 100644
--- a/xmloff/source/core/xmlimp.cxx
+++ b/xmloff/source/core/xmlimp.cxx
@@ -190,24 +190,31 @@ getBuildIdsProperty(uno::Reference<beans::XPropertySet> const& xImportInfo)
                             {
                                 mnGeneratorVersion = SvXMLImport::LO_3x;
                             }
-                            else
+                            else if ('4' == loVersion[0])
                             {
-                                SAL_INFO_IF('4' != loVersion[0], "xmloff.core", "unknown LO version: " << loVersion);
-                                if ('4' == loVersion[0] && loVersion.getLength() > 1
+                                if (loVersion.getLength() > 1
                                     && (loVersion[1] == '0' || loVersion[1] == '1'))
                                 {
                                     mnGeneratorVersion = SvXMLImport::LO_41x; // 4.0/4.1
                                 }
-                                else if ('4' == loVersion[0]
-                                    && loVersion.getLength() > 1 && loVersion[1] == '2')
+                                else if (loVersion.getLength() > 1 && '2' == loVersion[1])
                                 {
                                     mnGeneratorVersion = SvXMLImport::LO_42x; // 4.2
                                 }
-                                else
+                                else if (loVersion.getLength() > 1 && '3' == loVersion[1])
+                                {
+                                    mnGeneratorVersion = SvXMLImport::LO_43x; // 4.3
+                                }
+                                else if (loVersion.getLength() > 1 && '4' == loVersion[1])
                                 {
-                                    mnGeneratorVersion = SvXMLImport::LO_4x;
+                                    mnGeneratorVersion = SvXMLImport::LO_44x; // 4.4
                                 }
                             }
+                            else
+                            {
+                                SAL_INFO_IF('5' != loVersion[0], "xmloff.core", "unknown LO version: " << loVersion);
+                                mnGeneratorVersion = SvXMLImport::LO_5x;
+                            }
                             return; // ignore buildIds
                         }
                     }
diff --git a/xmloff/source/text/XMLTextFrameContext.cxx b/xmloff/source/text/XMLTextFrameContext.cxx
index 6389d8f..76e858c 100644
--- a/xmloff/source/text/XMLTextFrameContext.cxx
+++ b/xmloff/source/text/XMLTextFrameContext.cxx
@@ -593,6 +593,7 @@ void XMLTextFrameContext_Impl::Create( bool /*bHRefOrBase64*/ )
             (!sName.isEmpty() && sOrigName != sName) )
         {
             OUString sOldName( sName );
+
             sal_Int32 i = 0;
             while( xTextImportHelper->HasFrameByName( sName ) )
             {
@@ -601,8 +602,15 @@ void XMLTextFrameContext_Impl::Create( bool /*bHRefOrBase64*/ )
             }
             xNamed->setName( sName );
             if( sName != sOldName )
-                xTextImportHelper->GetRenameMap().Add( XML_TEXT_RENAME_TYPE_FRAME,
+            {
+                bool bSuccess = xTextImportHelper->GetRenameMap().Add( XML_TEXT_RENAME_TYPE_FRAME,
                                              sOldName, sName );
+                if (!bSuccess && GetImport().getGeneratorVersion() == SvXMLImport::LO_44x)
+                {
+                    bCreateFailed = true;
+                    return;
+                }
+            }
         }
     }
 
-- 
2.5.0