summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>2021-02-23 10:28:18 +0100
committerChristian Lohmaier <lohmaier+LibreOffice@googlemail.com>2021-03-02 19:29:33 +0100
commitf78648cdb3672972c47f59256305623d8ff5f444 (patch)
tree848cd1da7305b509dd4c1f36ba0493feabadfe25
parentupdate credits (diff)
downloadcore-f78648cdb3672972c47f59256305623d8ff5f444.tar.gz
core-f78648cdb3672972c47f59256305623d8ff5f444.zip
Possible race between retrieving and using parent window
Filepicker was called from extension, parent window was initialized in constructor with current top level window (extension dialog). Extension dialog got closed before file picker was shown in some cases, causing Show() method to fail Change-Id: Ie41585e6b05511ba2dff265374348b6041e9fa87 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111378 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> (cherry picked from commit 8c62c2fb88a7a82939ad3b5c7355c93a41b76d5b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111588 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de> Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> Tested-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
-rw-r--r--fpicker/source/win32/VistaFilePickerImpl.cxx16
1 files changed, 11 insertions, 5 deletions
diff --git a/fpicker/source/win32/VistaFilePickerImpl.cxx b/fpicker/source/win32/VistaFilePickerImpl.cxx
index c84fe5f3a72d..4be9c0737aa4 100644
--- a/fpicker/source/win32/VistaFilePickerImpl.cxx
+++ b/fpicker/source/win32/VistaFilePickerImpl.cxx
@@ -187,7 +187,7 @@ VistaFilePickerImpl::VistaFilePickerImpl()
, m_iEventHandler(new VistaFilePickerEventHandler(this))
, m_bInExecute (false)
, m_bWasExecuted (false)
- , m_hParentWindow(choose_parent_window())
+ , m_hParentWindow(nullptr)
, m_sDirectory ()
, m_sFilename ()
{
@@ -1026,19 +1026,25 @@ void VistaFilePickerImpl::impl_sta_ShowDialogModal(const RequestRef& rRequest)
}
}
-
HRESULT hResult = E_FAIL;
+ HWND hParentWindow;
+ {
+ osl::MutexGuard aLock(m_aMutex);
+ // Note that there is a potential race between retrieving and
+ // using parent window (window might get destroyed)
+ hParentWindow = m_hParentWindow ? m_hParentWindow : choose_parent_window();
+ }
try
{
// show dialog and wait for user decision
if (iOpen.is())
- hResult = iOpen->Show( m_hParentWindow ); // parent window needed
+ hResult = iOpen->Show( hParentWindow ); // parent window needed
else
if (iSave.is())
- hResult = iSave->Show( m_hParentWindow ); // parent window needed
+ hResult = iSave->Show( hParentWindow ); // parent window needed
else
if (iPick.is())
- hResult = iPick->Show( m_hParentWindow ); // parent window needed
+ hResult = iPick->Show( hParentWindow ); // parent window needed
}
catch(...)
{}