summaryrefslogtreecommitdiff
path: root/embeddedobj
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2014-08-27 14:29:43 +0300
committerTor Lillqvist <tml@collabora.com>2014-08-27 15:08:58 +0300
commit46ad54725bf28ea75278eb63dbf95c4a29618c1c (patch)
tree0f6b16b7198409e0d2c331df960101a25bcc0d6a /embeddedobj
parentb77bf9759a74454391fa5d2f4a6ec4594d6d3e89 (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.hxx1
-rw-r--r--embeddedobj/source/msole/oleembed.cxx14
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