diff options
author | Caolán McNamara <caolanm@redhat.com> | 2017-09-08 10:36:35 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2017-09-18 14:32:50 +0200 |
commit | 91c9026917ef930ab5f532ca62383a4dd6c0537c (patch) | |
tree | 8f91145ab5eb820523f439ca07457e83ca2d8306 /sw/source | |
parent | 2b74f20c67bc23f3321d8d9425300d363646f594 (diff) |
add fodt fuzzer
Change-Id: I3e4de4b9dab96f0e4bc9ca90896c2c54ae66ca20
Reviewed-on: https://gerrit.libreoffice.org/42251
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/filter/xml/xmlimp.cxx | 57 | ||||
-rw-r--r-- | sw/source/uibase/app/swdll.cxx | 4 | ||||
-rw-r--r-- | sw/source/uibase/app/swmodule.cxx | 4 | ||||
-rw-r--r-- | sw/source/uibase/uiview/view0.cxx | 3 |
4 files changed, 62 insertions, 6 deletions
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); |