diff options
author | Tor Lillqvist <tml@collabora.com> | 2014-08-27 14:29:43 +0300 |
---|---|---|
committer | Tor Lillqvist <tml@collabora.com> | 2014-08-27 15:08:58 +0300 |
commit | 46ad54725bf28ea75278eb63dbf95c4a29618c1c (patch) | |
tree | 0f6b16b7198409e0d2c331df960101a25bcc0d6a /embeddedobj | |
parent | b77bf9759a74454391fa5d2f4a6ec4594d6d3e89 (diff) |
bnc#648251: Avoid crash when attempting to open embedded OLE object as "text"
On non-Windows, when double-clicking an embedded OLE object, our glorious
content type detection logic detects it as "Text". As a side-effect, we start
to calculate text statistics on it. Which surely could produce interesting
numbers (you know what they say about statistics), but sadly causes a crash
involving the ICU RuleBasedBreakIterator, SwScanner,
sw::DocumentStatisticsManager and whatnot.
Avoid this by checking for a detected filter of type "Text" explicitly, and
avoiding the fun code paths in that case.
This leads to double-clicks being just ignored. Maybe it would be more useful
to produce a "General OLE Error" message box?
Change-Id: Iae0726b5e9c511a92bdff7229d2978cbf76cb07b
Diffstat (limited to 'embeddedobj')
-rw-r--r-- | embeddedobj/source/inc/oleembobj.hxx | 1 | ||||
-rw-r--r-- | embeddedobj/source/msole/oleembed.cxx | 14 |
2 files changed, 8 insertions, 7 deletions
diff --git a/embeddedobj/source/inc/oleembobj.hxx b/embeddedobj/source/inc/oleembobj.hxx index 42152742a0c4..4fa109e8d9c9 100644 --- a/embeddedobj/source/inc/oleembobj.hxx +++ b/embeddedobj/source/inc/oleembobj.hxx @@ -191,6 +191,7 @@ class OleEmbeddedObject : public ::cppu::WeakImplHelper5 // if the following member is set, the object works in wrapper mode ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedObject > m_xWrappedObject; bool m_bTriedConversion; + OUString m_aFilterName; // if m_bTriedConversion, then the filter detected by that ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xParent; diff --git a/embeddedobj/source/msole/oleembed.cxx b/embeddedobj/source/msole/oleembed.cxx index 144ecf555293..5c9df308897f 100644 --- a/embeddedobj/source/msole/oleembed.cxx +++ b/embeddedobj/source/msole/oleembed.cxx @@ -265,18 +265,18 @@ bool OleEmbeddedObject::TryToConvertToOOo() // the stream must be seekable uno::Reference< io::XSeekable > xSeekable( m_xObjectStream, uno::UNO_QUERY_THROW ); xSeekable->seek( 0 ); - OUString aFilterName = OwnView_Impl::GetFilterNameFromExtentionAndInStream( m_xFactory, OUString(), m_xObjectStream->getInputStream() ); + m_aFilterName = OwnView_Impl::GetFilterNameFromExtentionAndInStream( m_xFactory, OUString(), m_xObjectStream->getInputStream() ); // use the solution only for OOXML format currently - if ( !aFilterName.isEmpty() - && ( aFilterName == "Calc MS Excel 2007 XML" || aFilterName == "Impress MS PowerPoint 2007 XML" || aFilterName == "MS Word 2007 XML" ) ) + if ( !m_aFilterName.isEmpty() + && ( m_aFilterName == "Calc MS Excel 2007 XML" || m_aFilterName == "Impress MS PowerPoint 2007 XML" || m_aFilterName == "MS Word 2007 XML" ) ) { uno::Reference< container::XNameAccess > xFilterFactory( m_xFactory->createInstance("com.sun.star.document.FilterFactory"), uno::UNO_QUERY_THROW ); OUString aDocServiceName; - uno::Any aFilterAnyData = xFilterFactory->getByName( aFilterName ); + uno::Any aFilterAnyData = xFilterFactory->getByName( m_aFilterName ); uno::Sequence< beans::PropertyValue > aFilterData; if ( aFilterAnyData >>= aFilterData ) { @@ -309,7 +309,7 @@ bool OleEmbeddedObject::TryToConvertToOOo() aArgs[1].Name = "ReadOnly"; aArgs[1].Value <<= sal_True; aArgs[2].Name = "FilterName"; - aArgs[2].Value <<= aFilterName; + aArgs[2].Value <<= m_aFilterName; aArgs[3].Name = "URL"; aArgs[3].Value <<= OUString( "private:stream" ); aArgs[4].Name = "InputStream"; @@ -838,7 +838,7 @@ void SAL_CALL OleEmbeddedObject::doVerb( sal_Int32 nVerbID ) } } - if ( !m_pOwnView && m_xObjectStream.is() ) + if ( !m_pOwnView && m_xObjectStream.is() && m_aFilterName != "Text" ) { try { uno::Reference< io::XSeekable > xSeekable( m_xObjectStream, uno::UNO_QUERY ); @@ -859,7 +859,7 @@ void SAL_CALL OleEmbeddedObject::doVerb( sal_Int32 nVerbID ) } } - if ( !m_pOwnView || !m_pOwnView->Open() ) + if ( m_aFilterName != "Text" && (!m_pOwnView || !m_pOwnView->Open()) ) { //Make a RO copy and see if the OS can find something to at //least display the content for us |