• Lionel Elie Mamane's avatar
    fdo#63391 deadlock on opening .odb file that auto-connects to the database · 1981819e
    Lionel Elie Mamane yazdı
    Let foo.odb be a database file that has a macro that connects to the
    Database on "Open Document" event (and needs to prompt user for
    user/password).
    
    There was a race condition between two actions:
    
     1) the asynchronous treatment of "OnFirstControllerConnected" in dbaui::OApplicationController,
        which tries to get dbaui::OApplicationController's mutex
    
     2) the StarBasic macro calling dbaui::OApplicationController::connect
        which needs to display a dialog (to get username and password),
        and thus puts that dialog in the main thread's event queue
        and waits for it ... with dbaui::OApplicationController's mutex held
    
    Now, if "1)" is before "2)" in the event queue of the the main thread,
    *but* "1)" is executed *after* "2)" has taken the lock, there is a deadlock.
    
    Fix:
    
     1) Make OnFirstControllerConnected synchronous.
        Make sure (by taking mutex in dbaui::OApplicationController::attachFrame, its ancestor in the call graph)
        that nothing else will happen with the OApplicationController as long as it is not finished.
        ---> it does not need to take mutex itself anymore
    
        This avoids the "order in the asynchronous events" dependency.
    
     2) Change dbaui::OApplicationController::ensureConnection to do the user prompting
        WITHOUT HOLDING the mutex, and use the mutex "only" to protect actually assigning
        the connection to m_xDataSourceConnection.
    
        Theoretically, in some race condition, we could connect twice and then discard one connection <shrug>.
        ensureConnection will never return the discarded connection, though.
    
        (I think I got that right with respect to http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)
    
        This keeps it from locking on another condition while holding the mutex.
    
    Change-Id: Iab1bbec5d5df12bb89d027d43e498c78c92ffc32
    Reviewed-on: https://gerrit.libreoffice.org/3310Reviewed-by: 's avatarDavid Tardon <dtardon@redhat.com>
    Tested-by: 's avatarDavid Tardon <dtardon@redhat.com>
    1981819e
Adı
Son kayıt (commit)
Son güncelleme
..
inc Loading commit data...
qa Loading commit data...
source Loading commit data...
uiconfig Loading commit data...
util Loading commit data...
win32/source/odbcconfig Loading commit data...
AllLangResTarget_dba.mk Loading commit data...
AllLangResTarget_dbmm.mk Loading commit data...
AllLangResTarget_dbu.mk Loading commit data...
AllLangResTarget_sdbt.mk Loading commit data...
CppunitTest_dbaccess_macros_test.mk Loading commit data...
Executable_odbcconfig.mk Loading commit data...
JunitTest_dbaccess_complex.mk Loading commit data...
JunitTest_dbaccess_unoapi.mk Loading commit data...
Library_dba.mk Loading commit data...
Library_dbaxml.mk Loading commit data...
Library_dbmm.mk Loading commit data...
Library_dbu.mk Loading commit data...
Library_sdbt.mk Loading commit data...
Makefile Loading commit data...
Module_dbaccess.mk Loading commit data...
Package_inc.mk Loading commit data...
README Loading commit data...
UIConfig_dbaccess.mk Loading commit data...
UIConfig_dbapp.mk Loading commit data...
UIConfig_dbbrowser.mk Loading commit data...
UIConfig_dbquery.mk Loading commit data...
UIConfig_dbrelation.mk Loading commit data...
UIConfig_dbtable.mk Loading commit data...
UIConfig_dbtdata.mk Loading commit data...