[Libreoffice-commits] core.git: sw/source vcl/workben

Caolán McNamara caolanm at redhat.com
Mon Sep 18 12:33:17 UTC 2017


 sw/source/filter/xml/xmlimp.cxx   |   57 +++++++++++++++++++++++++++++++++++++-
 sw/source/uibase/app/swdll.cxx    |    4 +-
 sw/source/uibase/app/swmodule.cxx |    4 +-
 sw/source/uibase/uiview/view0.cxx |    3 +-
 vcl/workben/fftester.cxx          |   14 +++++++++
 5 files changed, 76 insertions(+), 6 deletions(-)

New commits:
commit 91c9026917ef930ab5f532ca62383a4dd6c0537c
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Sep 8 10:36:35 2017 +0100

    add fodt fuzzer
    
    Change-Id: I3e4de4b9dab96f0e4bc9ca90896c2c54ae66ca20
    Reviewed-on: https://gerrit.libreoffice.org/42251
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/source/filter/xml/xmlimp.cxx b/sw/source/filter/xml/xmlimp.cxx
index 5960e4092650..4ea3cebeef1e 100644
--- a/sw/source/filter/xml/xmlimp.cxx
+++ b/sw/source/filter/xml/xmlimp.cxx
@@ -24,6 +24,8 @@
 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
 #include <com/sun/star/drawing/XDrawPage.hpp>
 #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
+#include <com/sun/star/frame/XSynchronousFrameLoader.hpp>
 #include <com/sun/star/text/XTextDocument.hpp>
 #include <com/sun/star/text/XTextRange.hpp>
 
@@ -53,15 +55,20 @@
 #include <strings.hrc>
 #include "xmlimp.hxx"
 #include "xmltexti.hxx"
+#include "swdll.hxx"
 #include <xmloff/DocumentSettingsContext.hxx>
 #include <docsh.hxx>
 #include <editeng/unolingu.hxx>
 #include <svx/svdmodel.hxx>
 #include <svx/xmlgrhlp.hxx>
 #include <svx/xmleohlp.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/frame.hxx>
 #include <sfx2/printer.hxx>
 #include <xmloff/xmluconv.hxx>
 #include <unotools/saveopt.hxx>
+#include <unotools/streamwrap.hxx>
 #include <tools/diagnose_ex.h>
 
 #include <vcl/svapp.hxx>
@@ -71,6 +78,7 @@
 #include <xmloff/xformsimport.hxx>
 #include <comphelper/servicehelper.hxx>
 #include <comphelper/processfactory.hxx>
+#include <comphelper/propertysequence.hxx>
 
 #include <unordered_set>
 
@@ -397,7 +405,6 @@ SwXMLImport::SwXMLImport(
     m_pDoc( nullptr )
 {
     InitItemImport();
-
 }
 
 SwXMLImport::~SwXMLImport() throw ()
@@ -1540,4 +1547,52 @@ com_sun_star_comp_Writer_XMLOasisSettingsImporter_get_implementation(css::uno::X
     return cppu::acquire(new SwXMLImport(context, "com.sun.star.comp.Writer.XMLOasisSettingsImporter",
                 SvXMLImportFlags::SETTINGS));
 }
+
+extern "C" SAL_DLLPUBLIC_EXPORT bool SAL_CALL TestImportFODT(SvStream &rStream)
+{
+    SwGlobals::ensure();
+
+    SfxObjectShellLock xDocSh(new SwDocShell(SfxObjectCreateMode::INTERNAL));
+    xDocSh->DoInitNew();
+    uno::Reference<frame::XModel> xModel(xDocSh->GetModel());
+
+    uno::Reference<lang::XMultiServiceFactory> xMultiServiceFactory(comphelper::getProcessServiceFactory());
+    uno::Reference<io::XInputStream> xStream(new ::utl::OSeekableInputStreamWrapper(rStream));
+    uno::Reference<uno::XInterface> xInterface(xMultiServiceFactory->createInstance("com.sun.star.comp.Writer.XmlFilterAdaptor"), uno::UNO_QUERY_THROW);
+
+    css::uno::Sequence<OUString> aUserData(7);
+    aUserData[0] = "com.sun.star.comp.filter.OdfFlatXml";
+    aUserData[2] = "com.sun.star.comp.Writer.XMLOasisImporter";
+    aUserData[3] = "com.sun.star.comp.Writer.XMLOasisExporter";
+    aUserData[6] = "true";
+    uno::Sequence<beans::PropertyValue> aAdaptorArgs(comphelper::InitPropertySequence(
+    {
+        { "UserData", uno::Any(aUserData) },
+    }));
+    css::uno::Sequence<uno::Any> aOuterArgs(1);
+    aOuterArgs[0] <<= aAdaptorArgs;
+
+    uno::Reference<lang::XInitialization> xInit(xInterface, uno::UNO_QUERY_THROW);
+    xInit->initialize(aOuterArgs);
+
+    uno::Reference<document::XImporter> xImporter(xInterface, uno::UNO_QUERY_THROW);
+    uno::Sequence<beans::PropertyValue> aArgs(comphelper::InitPropertySequence(
+    {
+        { "InputStream", uno::Any(xStream) },
+        { "URL", uno::Any(OUString("private:stream")) },
+    }));
+    xImporter->setTargetDocument(xModel);
+
+    uno::Reference<document::XFilter> xFilter(xInterface, uno::UNO_QUERY_THROW);
+    //SetLoading hack because the document properties will be re-initted
+    //by the xml filter and during the init, while its considered uninitialized,
+    //setting a property will inform the document its modified, which attempts
+    //to update the properties, which throws cause the properties are uninitialized
+//    xDocSh->SetLoading(SfxLoadedFlags::NONE);
+    bool ret = xFilter->filter(aArgs);
+//    xDocSh->SetLoading(SfxLoadedFlags::ALL);
+
+    return ret;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/app/swdll.cxx b/sw/source/uibase/app/swdll.cxx
index d47a700af7a2..5bbee4388b53 100644
--- a/sw/source/uibase/app/swdll.cxx
+++ b/sw/source/uibase/app/swdll.cxx
@@ -89,7 +89,7 @@ SwDLL::SwDLL()
         xOpt.reset(new SvtModuleOptions);
     SfxObjectFactory* pDocFact = nullptr;
     SfxObjectFactory* pGlobDocFact = nullptr;
-    if (xOpt && xOpt->IsWriter())
+    if (!xOpt || xOpt->IsWriter())
     {
         pDocFact = &SwDocShell::Factory();
         pGlobDocFact = &SwGlobalDocShell::Factory();
@@ -103,7 +103,7 @@ SwDLL::SwDLL()
 
     pWDocFact->SetDocumentServiceName("com.sun.star.text.WebDocument");
 
-    if (xOpt && xOpt->IsWriter())
+    if (!xOpt || xOpt->IsWriter())
     {
         pGlobDocFact->SetDocumentServiceName("com.sun.star.text.GlobalDocument");
         pDocFact->SetDocumentServiceName("com.sun.star.text.TextDocument");
diff --git a/sw/source/uibase/app/swmodule.cxx b/sw/source/uibase/app/swmodule.cxx
index 962f7e7f14f1..72af465176a9 100644
--- a/sw/source/uibase/app/swmodule.cxx
+++ b/sw/source/uibase/app/swmodule.cxx
@@ -235,13 +235,13 @@ void SwDLL::RegisterFactories()
 {
     // These Id's must not be changed. Through these Id's the View (resume Documentview)
     // is created by Sfx.
-    if (!utl::ConfigManager::IsAvoidConfig() && SvtModuleOptions().IsWriter())
+    if (utl::ConfigManager::IsAvoidConfig() || SvtModuleOptions().IsWriter())
         SwView::RegisterFactory         ( SFX_INTERFACE_SFXDOCSH );
 
 #if HAVE_FEATURE_DESKTOP
     SwWebView::RegisterFactory        ( SFX_INTERFACE_SFXMODULE );
 
-    if (!utl::ConfigManager::IsAvoidConfig() && SvtModuleOptions().IsWriter())
+    if (utl::ConfigManager::IsAvoidConfig() || SvtModuleOptions().IsWriter())
     {
         SwSrcView::RegisterFactory      ( SfxInterfaceId(6) );
         SwPagePreview::RegisterFactory  ( SfxInterfaceId(7) );
diff --git a/sw/source/uibase/uiview/view0.cxx b/sw/source/uibase/uiview/view0.cxx
index 59f90e5eede2..1a62e8ee7e91 100644
--- a/sw/source/uibase/uiview/view0.cxx
+++ b/sw/source/uibase/uiview/view0.cxx
@@ -24,6 +24,7 @@
 #include <svl/srchitem.hxx>
 #include <SwSpellDialogChildWindow.hxx>
 #include <svl/eitem.hxx>
+#include <unotools/configmgr.hxx>
 #include <unotools/linguprops.hxx>
 #include <unotools/lingucfg.hxx>
 #include <viewopt.hxx>
@@ -76,7 +77,7 @@ using namespace ::com::sun::star;
 
 SFX_IMPL_NAMED_VIEWFACTORY(SwView, "Default")
 {
-    if ( SvtModuleOptions().IsWriter() )
+    if (utl::ConfigManager::IsAvoidConfig() || SvtModuleOptions().IsWriter())
     {
         SFX_VIEW_REGISTRATION(SwDocShell);
         SFX_VIEW_REGISTRATION(SwGlobalDocShell);
diff --git a/vcl/workben/fftester.cxx b/vcl/workben/fftester.cxx
index 19e37ca0b0d6..aaf05df5311e 100644
--- a/vcl/workben/fftester.cxx
+++ b/vcl/workben/fftester.cxx
@@ -379,6 +379,20 @@ try_again:
                 SvFileStream aFileStream(out, StreamMode::READ);
                 ret = (int) (*pfnImport)(aFileStream);
             }
+            else if (strcmp(argv[2], "fodt") == 0)
+            {
+                static FFilterCall pfnImport(nullptr);
+                if (!pfnImport)
+                {
+                    osl::Module aLibrary;
+                    aLibrary.loadRelative(&thisModule, "libswlo.so", SAL_LOADMODULE_LAZY);
+                    pfnImport = reinterpret_cast<FFilterCall>(
+                        aLibrary.getFunctionSymbol("TestImportFODT"));
+                    aLibrary.release();
+                }
+                SvFileStream aFileStream(out, StreamMode::READ);
+                ret = (int) (*pfnImport)(aFileStream);
+            }
             else if (strcmp(argv[2], "xls") == 0)
             {
                 static WFilterCall pfnImport(nullptr);


More information about the Libreoffice-commits mailing list