From 8c62c2fb88a7a82939ad3b5c7355c93a41b76d5b Mon Sep 17 00:00:00 2001 From: Samuel Mehrbrodt Date: Tue, 23 Feb 2021 10:28:18 +0100 Subject: 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 --- fpicker/source/win32/VistaFilePickerImpl.cxx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/fpicker/source/win32/VistaFilePickerImpl.cxx b/fpicker/source/win32/VistaFilePickerImpl.cxx index ba53a2c9175e..0355e940c6f9 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 () , mnNbCallCoInitializeExForReinit(0) @@ -1022,19 +1022,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(...) {} -- cgit