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/+/111420
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
diff --git a/fpicker/source/win32/VistaFilePickerImpl.cxx b/fpicker/source/win32/VistaFilePickerImpl.cxx
index d6e1011..c9a29a1 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)
@@ -1019,19 +1019,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(...)
    {}