sfx2/source/sidebar/SidebarController.cxx |   23 ++++++++++++++++++++---
 sfx2/source/sidebar/SidebarPanelBase.cxx  |   14 ++++++++++++++
 sfx2/source/sidebar/Theme.cxx             |   20 ++++++++++++++++++++
 3 files changed, 54 insertions(+), 3 deletions(-)

New commits:
commit b379d483e70d2edf868c2fde4b54da2581625d22
Author:     Thorsten Behrens <thorsten.behr...@cib.de>
AuthorDate: Thu Nov 19 14:00:57 2020 +0100
Commit:     Thorsten Behrens <thorsten.behr...@cib.de>
CommitDate: Fri Nov 20 08:22:50 2020 +0100

    fix tdf#138335 guard sidebar uno methods with SolarMutex
    
    Wasn't threadsafe before; using vcl/gui code, so we need the
    SolarMutex.
    
    Conflicts:
            sfx2/source/sidebar/SidebarController.cxx
    
    Change-Id: I3d4407f095837d03ad492fcdf9a08746cf911d25
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106169
    Tested-by: Jenkins
    Reviewed-by: Thorsten Behrens <thorsten.behr...@cib.de>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106211
    Tested-by: Thorsten Behrens <thorsten.behr...@cib.de>

diff --git a/sfx2/source/sidebar/SidebarController.cxx 
b/sfx2/source/sidebar/SidebarController.cxx
index 5c69f97d0b59..6161967f7920 100644
--- a/sfx2/source/sidebar/SidebarController.cxx
+++ b/sfx2/source/sidebar/SidebarController.cxx
@@ -256,6 +256,8 @@ void SidebarController::disposeDecks()
 
 void SAL_CALL SidebarController::disposing()
 {
+    SolarMutexGuard aSolarMutexGuard;
+
     mpCloseIndicator.disposeAndClear();
 
     maFocusManager.Clear();
@@ -313,6 +315,8 @@ void SAL_CALL SidebarController::disposing()
 
 void SAL_CALL SidebarController::notifyContextChangeEvent (const 
css::ui::ContextChangeEventObject& rEvent)
 {
+    SolarMutexGuard aSolarMutexGuard;
+
     // Update to the requested new context asynchronously to avoid
     // subtle errors caused by SFX2 which in rare cases can not
     // properly handle a synchronous update.
@@ -325,7 +329,9 @@ void SAL_CALL SidebarController::notifyContextChangeEvent 
(const css::ui::Contex
     {
         mxCurrentController.set(rEvent.Source, css::uno::UNO_QUERY);
         maAsynchronousDeckSwitch.CancelRequest();
-        maContextChangeUpdate.RequestCall();
+        maContextChangeUpdate.RequestCall(); // async call, not a prob
+                                             // calling with held
+                                             // solarmutex
         // TODO: this call is redundant but mandatory for unit test to update 
context on document loading
         UpdateConfigurations();
     }
@@ -333,16 +339,24 @@ void SAL_CALL SidebarController::notifyContextChangeEvent 
(const css::ui::Contex
 
 void SAL_CALL SidebarController::disposing (const css::lang::EventObject& )
 {
+    SolarMutexGuard aSolarMutexGuard;
+
     dispose();
 }
 
 void SAL_CALL SidebarController::propertyChange (const 
css::beans::PropertyChangeEvent& )
 {
-    maPropertyChangeForwarder.RequestCall();
+    SolarMutexGuard aSolarMutexGuard;
+
+    maPropertyChangeForwarder.RequestCall(); // async call, not a prob
+                                             // to call with held
+                                             // solarmutex
 }
 
 void SAL_CALL SidebarController::statusChanged (const 
css::frame::FeatureStateEvent& rEvent)
 {
+    SolarMutexGuard aSolarMutexGuard;
+
     bool bIsReadWrite (true);
     if (rEvent.IsEnabled)
         rEvent.State >>= bIsReadWrite;
@@ -357,12 +371,15 @@ void SAL_CALL SidebarController::statusChanged (const 
css::frame::FeatureStateEv
 
         mnRequestedForceFlags |= SwitchFlag_ForceSwitch;
         maAsynchronousDeckSwitch.CancelRequest();
-        maContextChangeUpdate.RequestCall();
+        maContextChangeUpdate.RequestCall(); // async call, ok to call
+                                             // with held solarmutex
     }
 }
 
 void SAL_CALL SidebarController::requestLayout()
 {
+    SolarMutexGuard aSolarMutexGuard;
+
     sal_Int32 nMinimalWidth = 0;
     if (mpCurrentDeck && !mpCurrentDeck->isDisposed())
     {
diff --git a/sfx2/source/sidebar/SidebarPanelBase.cxx 
b/sfx2/source/sidebar/SidebarPanelBase.cxx
index 0906dc962d57..4a7ec6ade4fd 100644
--- a/sfx2/source/sidebar/SidebarPanelBase.cxx
+++ b/sfx2/source/sidebar/SidebarPanelBase.cxx
@@ -79,6 +79,8 @@ SidebarPanelBase::~SidebarPanelBase()
 
 void SAL_CALL SidebarPanelBase::disposing()
 {
+    SolarMutexGuard aGuard;
+
     mpControl.disposeAndClear();
 
     if (mxFrame.is())
@@ -95,6 +97,8 @@ void SAL_CALL SidebarPanelBase::disposing()
 void SAL_CALL SidebarPanelBase::notifyContextChangeEvent (
     const ui::ContextChangeEventObject& rEvent)
 {
+    SolarMutexGuard aGuard;
+
     IContextChangeReceiver* pContextChangeReceiver
         = dynamic_cast<IContextChangeReceiver*>(mpControl.get());
     if (pContextChangeReceiver != nullptr)
@@ -109,6 +113,8 @@ void SAL_CALL SidebarPanelBase::notifyContextChangeEvent (
 void SAL_CALL SidebarPanelBase::disposing (
     const css::lang::EventObject&)
 {
+    SolarMutexGuard aGuard;
+
     mxFrame = nullptr;
     mpControl = nullptr;
 }
@@ -142,6 +148,8 @@ Reference<accessibility::XAccessible> SAL_CALL 
SidebarPanelBase::createAccessibl
 
 Reference<awt::XWindow> SAL_CALL SidebarPanelBase::getWindow()
 {
+    SolarMutexGuard aGuard;
+
     if (mpControl != nullptr)
         return Reference<awt::XWindow>(
             mpControl->GetComponentInterface(),
@@ -152,6 +160,8 @@ Reference<awt::XWindow> SAL_CALL 
SidebarPanelBase::getWindow()
 
 ui::LayoutSize SAL_CALL SidebarPanelBase::getHeightForWidth (const sal_Int32 
nWidth)
 {
+    SolarMutexGuard aGuard;
+
     if (maLayoutSize.Minimum >= 0)
         return maLayoutSize;
     else
@@ -178,6 +188,8 @@ ui::LayoutSize SAL_CALL SidebarPanelBase::getHeightForWidth 
(const sal_Int32 nWi
 
 sal_Int32 SAL_CALL SidebarPanelBase::getMinimalWidth ()
 {
+    SolarMutexGuard aGuard;
+
     if (isLayoutEnabled(mpControl))
     {
         // widget layout-based sidebar
@@ -189,6 +201,8 @@ sal_Int32 SAL_CALL SidebarPanelBase::getMinimalWidth ()
 
 void SAL_CALL SidebarPanelBase::updateModel(const 
css::uno::Reference<css::frame::XModel>& xModel)
 {
+    SolarMutexGuard aGuard;
+
     SidebarModelUpdate* pModelUpdate = 
dynamic_cast<SidebarModelUpdate*>(mpControl.get());
     if (!pModelUpdate)
         return;
diff --git a/sfx2/source/sidebar/Theme.cxx b/sfx2/source/sidebar/Theme.cxx
index 90ab20e46f15..c3175d9e9f45 100644
--- a/sfx2/source/sidebar/Theme.cxx
+++ b/sfx2/source/sidebar/Theme.cxx
@@ -347,6 +347,8 @@ void Theme::UpdateTheme()
 
 void SAL_CALL Theme::disposing()
 {
+    SolarMutexGuard aGuard;
+
     ChangeListeners aListeners;
     aListeners.swap(maChangeListeners);
 
@@ -381,6 +383,8 @@ void SAL_CALL Theme::setPropertyValue (
     const OUString& rsPropertyName,
     const css::uno::Any& rValue)
 {
+    SolarMutexGuard aGuard;
+
     PropertyNameToIdMap::const_iterator iId 
(maPropertyNameToIdMap.find(rsPropertyName));
     if (iId == maPropertyNameToIdMap.end())
         throw beans::UnknownPropertyException(rsPropertyName);
@@ -423,6 +427,8 @@ void SAL_CALL Theme::setPropertyValue (
 Any SAL_CALL Theme::getPropertyValue (
     const OUString& rsPropertyName)
 {
+    SolarMutexGuard aGuard;
+
     PropertyNameToIdMap::const_iterator iId 
(maPropertyNameToIdMap.find(rsPropertyName));
     if (iId == maPropertyNameToIdMap.end())
         throw beans::UnknownPropertyException(rsPropertyName);
@@ -440,6 +446,8 @@ void SAL_CALL Theme::addPropertyChangeListener(
     const OUString& rsPropertyName,
     const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
 {
+    SolarMutexGuard aGuard;
+
     ThemeItem eItem (AnyItem_);
     if (rsPropertyName.getLength() > 0)
     {
@@ -462,6 +470,8 @@ void SAL_CALL Theme::removePropertyChangeListener(
     const OUString& rsPropertyName,
     const css::uno::Reference<css::beans::XPropertyChangeListener>& rxListener)
 {
+    SolarMutexGuard aGuard;
+
     ThemeItem eItem (AnyItem_);
     if (rsPropertyName.getLength() > 0)
     {
@@ -494,6 +504,8 @@ void SAL_CALL Theme::addVetoableChangeListener(
     const OUString& rsPropertyName,
     const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
 {
+    SolarMutexGuard aGuard;
+
     ThemeItem eItem (AnyItem_);
     if (rsPropertyName.getLength() > 0)
     {
@@ -516,6 +528,8 @@ void SAL_CALL Theme::removeVetoableChangeListener(
     const OUString& rsPropertyName,
     const css::uno::Reference<css::beans::XVetoableChangeListener>& rxListener)
 {
+    SolarMutexGuard aGuard;
+
     ThemeItem eItem (AnyItem_);
     if (rsPropertyName.getLength() > 0)
     {
@@ -545,6 +559,8 @@ void SAL_CALL Theme::removeVetoableChangeListener(
 
 css::uno::Sequence<css::beans::Property> SAL_CALL Theme::getProperties()
 {
+    SolarMutexGuard aGuard;
+
     ::std::vector<beans::Property> aProperties;
 
     sal_Int32 const nEnd(End_);
@@ -570,6 +586,8 @@ css::uno::Sequence<css::beans::Property> SAL_CALL 
Theme::getProperties()
 
 beans::Property SAL_CALL Theme::getPropertyByName (const OUString& 
rsPropertyName)
 {
+    SolarMutexGuard aGuard;
+
     PropertyNameToIdMap::const_iterator iId 
(maPropertyNameToIdMap.find(rsPropertyName));
     if (iId == maPropertyNameToIdMap.end())
         throw beans::UnknownPropertyException(rsPropertyName);
@@ -589,6 +607,8 @@ beans::Property SAL_CALL Theme::getPropertyByName (const 
OUString& rsPropertyNam
 
 sal_Bool SAL_CALL Theme::hasPropertyByName (const OUString& rsPropertyName)
 {
+    SolarMutexGuard aGuard;
+
     PropertyNameToIdMap::const_iterator iId 
(maPropertyNameToIdMap.find(rsPropertyName));
     if (iId == maPropertyNameToIdMap.end())
         return false;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to