diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-01-14 13:19:32 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2019-01-14 15:03:32 +0100 |
commit | 1977291fc08de7425db469e21bd2ad385e722707 (patch) | |
tree | 57616fc8c2599f35f6c04c208b2360615859681a | |
parent | 8aa5abf3aaae062ae41a4d2f122170da9e31cf67 (diff) |
tdf#122250 Crash when running extension
as a consequence of
commit 4e07987ce8134312920682e3481c3f8e3d7b66c3
Date: Thu Aug 25 15:08:55 2016 +0200
cid#1371154 Missing move assignment operator
this extensions appears to pass bogus data into VCLXWindow::setProperty,
so I had to workaround that when debugging
Change-Id: Ib6728c0a990bd7cfbfed43d79b7560bd2f7f5a67
Reviewed-on: https://gerrit.libreoffice.org/66293
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | basic/source/sbx/sbxarray.cxx | 6 | ||||
-rw-r--r-- | toolkit/source/awt/vclxwindow.cxx | 2 |
2 files changed, 7 insertions, 1 deletions
diff --git a/basic/source/sbx/sbxarray.cxx b/basic/source/sbx/sbxarray.cxx index fc86839c1d24..1b7054f2d9f7 100644 --- a/basic/source/sbx/sbxarray.cxx +++ b/basic/source/sbx/sbxarray.cxx @@ -190,10 +190,14 @@ void SbxArray::Put( SbxVariable* pVar, sal_uInt16 nIdx ) if( eType != SbxOBJECT || pVar->GetClass() != SbxClassType::Object ) pVar->Convert( eType ); SbxVariableRef& rRef = GetRef( nIdx ); + // tdf#122250. It is possible that I hold the last reference to myself, so check, otherwise I might + // call SetFlag on myself after I have died. + bool removingMyself = rRef.get() && rRef->GetParameters() == this && GetRefCount() == 1; if(rRef.get() != pVar ) { rRef = pVar; - SetFlag( SbxFlagBits::Modified ); + if (!removingMyself) + SetFlag( SbxFlagBits::Modified ); } } } diff --git a/toolkit/source/awt/vclxwindow.cxx b/toolkit/source/awt/vclxwindow.cxx index ddd25add186a..6f8212149db8 100644 --- a/toolkit/source/awt/vclxwindow.cxx +++ b/toolkit/source/awt/vclxwindow.cxx @@ -1717,6 +1717,8 @@ void VCLXWindow::setProperty( const OUString& PropertyName, const css::uno::Any& WinBits nStyle = pWindow->GetStyle(); sal_uInt16 nTmp = 0; Value >>= nTmp; + // clear any dodgy bits passed in, can come from dodgy extensions + nTmp &= o3tl::typed_flags<WindowBorderStyle>::mask; WindowBorderStyle nBorder = static_cast<WindowBorderStyle>(nTmp); if ( !bool(nBorder) ) { |