vcl/unx/gtk3/gtk3gtkinst.cxx |    7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

New commits:
commit e11fcd8141b359a88be59c17fa6900a684cd4b8e
Author:     Michael Stahl <[email protected]>
AuthorDate: Tue Jan 29 18:39:25 2019 +0100
Commit:     Thorsten Behrens <[email protected]>
CommitDate: Wed Jan 30 20:22:10 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 <[email protected]>
    (cherry picked from commit 9286cebdff378a19ec146183676c6da96aac77db)
    Reviewed-on: https://gerrit.libreoffice.org/67152
    Reviewed-by: Thorsten Behrens <[email protected]>

diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 3c1c8ece9281..32da17be9fc5 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -614,6 +614,12 @@ void VclGtkClipboard::setContents(
         const Reference< css::datatransfer::XTransferable >& xTrans,
         const Reference< css::datatransfer::clipboard::XClipboardOwner >& 
xClipboardOwner )
 {
+    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 );
@@ -632,7 +638,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())
         {
_______________________________________________
Libreoffice-commits mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to