embeddedobj/source/msole/olemisc.cxx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
New commits: commit 53ac9e0f3ceff4a18929818667bb8aae9c05ad12 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Thu Aug 22 09:27:34 2024 +0500 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Thu Aug 22 08:22:49 2024 +0200 Make OleEmbeddedObject::GetRidOfComponent safer when releasing lock Thanks Michael Stahl for the useful advise - see https://gerrit.libreoffice.org/c/core/+/171996/comment/4dc20148_5ec861ad/ Change-Id: I16e1876a81a52f291ede49572f012c15d4cd9a6d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172233 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/embeddedobj/source/msole/olemisc.cxx b/embeddedobj/source/msole/olemisc.cxx index 13fc558a529e..582ae49de56f 100644 --- a/embeddedobj/source/msole/olemisc.cxx +++ b/embeddedobj/source/msole/olemisc.cxx @@ -230,23 +230,26 @@ void OleEmbeddedObject::GetRidOfComponent(osl::ResettableMutexGuard* guard) SaveObject_Impl(); m_pOleComponent->removeCloseListener( m_xClosePreventer ); + // When releasing the guard below, avoid a case when two threads are doing the same; + // store the reference on stack and clear m_pOleComponent in advance + rtl::Reference<OleComponent> pOleComponent(std::move(m_pOleComponent)); try { std::optional<osl::ResettableMutexGuardScopedReleaser> oReleaser; if (guard) oReleaser.emplace(*guard); - m_pOleComponent->close( false ); + pOleComponent->close(false); } catch( const uno::Exception& ) { + m_pOleComponent = std::move(pOleComponent); // TODO: there should be a special listener to wait for component closing // and to notify object, may be object itself can be such a listener m_pOleComponent->addCloseListener( m_xClosePreventer ); throw; } - m_pOleComponent->disconnectEmbeddedObject(); - m_pOleComponent.clear(); + pOleComponent->disconnectEmbeddedObject(); } #else (void)guard;