svtools/source/misc/transfer.cxx | 4 ---- vcl/unx/gtk3/gtk3gtkinst.cxx | 7 ++++++- 2 files changed, 6 insertions(+), 5 deletions(-)
New commits: commit 23f4be51ddc410acb71634ca6c50ca52664dca86 Author: Michael Stahl <michael.st...@cib.de> AuthorDate: Tue Jan 29 18:39:25 2019 +0100 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Wed Jan 30 15:06:44 2019 +0100 vcl: fix deadlock in VclGtkClipboard::setContents() Must not call getTransferDataFlavors with m_Mutex held; 6 TransferableHelper::getTransferDataFlavors() (this=0x567b980) at svtools/source/misc/transfer.cxx:392 7 VclGtkClipboard::setContents(com::sun::star::uno::Reference<com::sun::star::datatransfer::XTransferable> const&, com::sun::star::uno::Reference<com::sun::star::datatransfer::clipboard::XClipboardOwner> const&) (this=0x3199550, xTrans=uno::Reference to (SwTransferable *) 0x567b9a8, xClipboardOwner=uno::Reference to (SwTransferable *) 0x567b9b0) at vcl/unx/gtk3_kde5/../gtk3/gtk3gtkinst.cxx:618 8 TransferableHelper::CopyToSelection(vcl::Window*) const (this=0x567b980, pWindow=0x301b0c0) at svtools/source/misc/transfer.cxx:960 CopyToSelection() uses SolarMutexReleaser, then getTransferDataFlavors() has a SolarMutexGuard; this will deadlock against the main thread that holds SolarMutex and calls VclGtkClipboard::setContents() itself, from VclGtkClipboard::OwnerPossiblyChanged(). Change-Id: Ibda0b6bce6f3388c45cee8077dd977abb3dda366 Reviewed-on: https://gerrit.libreoffice.org/67121 Tested-by: Jenkins Reviewed-by: Michael Stahl <michael.st...@cib.de> (cherry picked from commit 9286cebdff378a19ec146183676c6da96aac77db) diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 7202b4681c8d..426cc235c5a9 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -597,6 +597,12 @@ void VclGtkClipboard::setContents( const Reference< css::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner ) throw(RuntimeException, std::exception) { + css::uno::Sequence<css::datatransfer::DataFlavor> aFormats; + if (xTrans.is()) + { + aFormats = xTrans->getTransferDataFlavors(); + } + osl::ClearableMutexGuard aGuard( m_aMutex ); Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner ); Reference< datatransfer::XTransferable > xOldContents( m_aContents ); @@ -615,7 +621,6 @@ void VclGtkClipboard::setContents( assert(m_aGtkTargets.empty()); if (m_aContents.is()) { - css::uno::Sequence<css::datatransfer::DataFlavor> aFormats = xTrans->getTransferDataFlavors(); std::vector<GtkTargetEntry> aGtkTargets(m_aConversionHelper.FormatsToGtk(aFormats)); if (!aGtkTargets.empty()) { commit 3ea2b2a7406f76754def5b7d321b25ca429562d8 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> AuthorDate: Thu Jul 14 21:59:30 2016 +0200 Commit: Michael Stahl <michael.st...@cib.de> CommitDate: Wed Jan 30 15:06:44 2019 +0100 try to avoid the deadlock around the clipboard, tdf#56818 This deadlocks in the case that we have an external process communicating with LibreOffice as the SolarMutexReleaser allows a connection to be processed while the normal code has just released the SolarMutex. If the external call code now goes down the same code path we deadlock on the SolarMutex together with other mutexes in the clipboard code. Change-Id: I18fd6953c9566452a31b1a4c32c68494ec7a52ac Reviewed-on: https://gerrit.libreoffice.org/27251 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> (cherry picked from commit ed7e74ae1c7ecfc29df152a8397fb9f6e1763a60) diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx index f21d861d759f..fbfb9d2a4310 100644 --- a/svtools/source/misc/transfer.cxx +++ b/svtools/source/misc/transfer.cxx @@ -922,8 +922,6 @@ void TransferableHelper::CopyToClipboard( vcl::Window *pWindow ) const if( mxClipboard.is() && !mxTerminateListener.is() ) { - SolarMutexReleaser aReleaser; - try { TransferableHelper* pThis = const_cast< TransferableHelper* >( this ); @@ -949,8 +947,6 @@ void TransferableHelper::CopyToSelection( vcl::Window *pWindow ) const if( xSelection.is() && !mxTerminateListener.is() ) { - SolarMutexReleaser aReleaser; - try { TransferableHelper* pThis = const_cast< TransferableHelper* >( this ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits