summaryrefslogtreecommitdiff
path: root/fpicker
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>2021-02-23 10:28:18 +0100
committerThorsten Behrens <thorsten.behrens@allotropia.de>2021-02-26 00:31:49 +0100
commit06ea737787dd0e1cd926dfee240538b7ddef1f64 (patch)
tree6b9231123bb24e4cd44320e866a81ee0292079d4 /fpicker
parent8b5922443654b8fc7354801c9ada17274f60eb8f (diff)
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/+/111379 Tested-by: Thorsten Behrens <thorsten.behrens@allotropia.de> Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Diffstat (limited to 'fpicker')
-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 3c3286fe2f14..941a8c64d44c 100644
--- a/fpicker/source/win32/VistaFilePickerImpl.cxx
+++ b/fpicker/source/win32/VistaFilePickerImpl.cxx
@@ -187,10 +187,10 @@ VistaFilePickerImpl::VistaFilePickerImpl()
, m_iEventHandler(new VistaFilePickerEventHandler(this))
, m_bInExecute (false)
, m_bWasExecuted (false)
+ , m_hParentWindow(nullptr)
, m_sDirectory ()
, m_sFilename ()
{
- m_hParentWindow = choose_parent_window();
}
@@ -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(...)
{}