ucb/source/ucp/webdav-curl/SerfLockStore.cxx |   23 ++++++++++++-----------
 ucb/source/ucp/webdav-curl/SerfLockStore.hxx |    2 +-
 2 files changed, 13 insertions(+), 12 deletions(-)

New commits:
commit 21a1267b15724fcadb089065f57c5daf0fd6ba26
Author:     Michael Stahl <mst...@redhat.com>
AuthorDate: Thu May 30 17:13:50 2013 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Mon Nov 1 18:24:26 2021 +0100

    ucb: webdav-curl: NeonLockStore::stopTicker(): really avoid deadlock
    
    Follow up on 68ba2785c55eaa1ea70ce135bdad5322b0e04ed7, which missed the
    sad fact that m_aMutex is locked recursively.
    
    Avoid that by passing a ClearableMutexGuard to stopTicker() and
    unlocking that.  Also lock m_aMutex in the destructor while at it.
    
    [ port of commit 13b60fd80a7adfb0ef81a818917cfec5edfc6edc ]
    
    Change-Id: I65bb4ec98f13d28089c3b2eb3300074944024188
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123181
    Tested-by: Michael Stahl <michael.st...@allotropia.de>
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/ucb/source/ucp/webdav-curl/SerfLockStore.cxx 
b/ucb/source/ucp/webdav-curl/SerfLockStore.cxx
index 6380fe6e7447..62526bd873fc 100644
--- a/ucb/source/ucp/webdav-curl/SerfLockStore.cxx
+++ b/ucb/source/ucp/webdav-curl/SerfLockStore.cxx
@@ -89,7 +89,9 @@ SerfLockStore::SerfLockStore()
 
 SerfLockStore::~SerfLockStore()
 {
-    stopTicker();
+    osl::ResettableMutexGuard aGuard(m_aMutex);
+    stopTicker(aGuard);
+    aGuard.reset(); // actually no threads should even try to access members 
now
     m_bFinishing = true;
 
     // release active locks, if any.
@@ -119,23 +121,22 @@ void SerfLockStore::startTicker()
 }
 
 
-void SerfLockStore::stopTicker()
+void SerfLockStore::stopTicker(osl::ClearableMutexGuard & rGuard)
 {
     rtl::Reference<TickerThread> pTickerThread;
-    {
-        osl::MutexGuard aGuard( m_aMutex );
 
-        if (!m_pTickerThread.is())
-        {
-            return; // nothing to do
-        }
+    if (m_pTickerThread.is())
+    {
         m_pTickerThread->finish(); // needs mutex
         // the TickerThread may run refreshLocks() at most once after this
         pTickerThread = m_pTickerThread;
         m_pTickerThread.clear();
     }
 
-    pTickerThread->join(); // without m_aMutex locked (to prevent deadlock)
+    rGuard.clear();
+
+    if (pTickerThread.is())
+        pTickerThread->join(); // without m_aMutex locked (to prevent deadlock)
 }
 
 OUString SerfLockStore::getLockToken( const OUString& rLock )
@@ -214,12 +215,12 @@ void SerfLockStore::updateLock( const OUString& rLock,
 
 void SerfLockStore::removeLock( const OUString& rLock )
 {
-    osl::MutexGuard aGuard( m_aMutex );
+    osl::ClearableMutexGuard aGuard( m_aMutex );
 
     m_aLockInfoMap.erase( rLock );
 
     if ( m_aLockInfoMap.empty() )
-        stopTicker();
+        stopTicker(aGuard);
 }
 
 
diff --git a/ucb/source/ucp/webdav-curl/SerfLockStore.hxx 
b/ucb/source/ucp/webdav-curl/SerfLockStore.hxx
index 62a859be639d..4aeb3a020dbc 100644
--- a/ucb/source/ucp/webdav-curl/SerfLockStore.hxx
+++ b/ucb/source/ucp/webdav-curl/SerfLockStore.hxx
@@ -89,7 +89,7 @@ public:
 
 private:
     void startTicker();
-    void stopTicker();
+    void stopTicker(osl::ClearableMutexGuard & rGuard);
 };
 
 } // namespace http_dav_ucp

Reply via email to