Skip to content

Deadlock in Classic Server with self-security database and ON CONNECT trigger that access some MON$ table(s) is possible #9136

Description

@hvlad

The bug was reported privately.

To reproduce, all conditions below must be met:

  • Classic Server,
  • self-security database,
  • ON CONNECT trigger accessing any monitoring table.

First user connection run user-management statement (CREATE USER or a like) and commits it.
Second user connection establish connection.
It is possible that second user connection's creates monitoring snapshot at the moment when first user connection commits and executed user-management statement.

Stack of the main thread of the 1st process

 	ntdll.dll!NtWaitForSingleObject()	Unknown
 	KernelBase.dll!WaitForSingleObjectEx()	Unknown
>	engine13.dll!Firebird::SharedMemoryBase::eventWait(Firebird::event_t * event=0x000000000473dfa8, const long value=2, const long micro_seconds=10000000) Line 746	C++
 	engine13.dll!Jrd::LockManager::wait_for_request(Jrd::thread_db * tdbb=0x0000000000148d90, lrq * request=0x0000000004741850, short lck_wait=1) Line 3838	C++
 	engine13.dll!Jrd::LockManager::grant_or_que(Jrd::thread_db * tdbb=0x0000000000148d90, lrq * request=0x0000000004741850, lbl * lock=0x0000000004733710, short lck_wait=1) Line 2223	C++
 	engine13.dll!Jrd::LockManager::enqueue(Jrd::thread_db * tdbb=0x0000000000148d90, Firebird::CheckStatusWrapper * statusVector=0x0000000000145f18, long prior_request=0, const unsigned short series=19, const unsigned char * value=0x0000000000146318, const unsigned short length=8, unsigned char type='\x2', int(*)(void *) ast_routine=0x0000000000000000, void * ast_argument=0x0000000000000000, __int64 data=0, short lck_wait=1, long owner_offset=122712) Line 549	C++
 	engine13.dll!enqueue(Jrd::thread_db * tdbb=0x0000000000148d90, Firebird::CheckStatusWrapper * statusVector=0x0000000000145f18, Jrd::Lock * lock=0x00000000001462a0, unsigned short level=2, short wait=1) Line 949	C++
 	engine13.dll!ENQUEUE(Jrd::thread_db * tdbb=0x0000000000148d90, Firebird::CheckStatusWrapper * statusVector=0x0000000000145f18, Jrd::Lock * lock=0x00000000001462a0, unsigned short level=2, short wait=1) Line 149	C++
 	engine13.dll!LCK_lock(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::Lock * lock=0x00000000001462a0, unsigned short level=2, short wait=1) Line 676	C++
 	engine13.dll!Jrd::MonitoringSnapshot::MonitoringSnapshot(Jrd::thread_db * tdbb=0x0000000000148d90, Firebird::MemoryPool & pool={...}) Line 519	C++
 	engine13.dll!Jrd::MonitoringSnapshot::create(Jrd::thread_db * tdbb=0x0000000000148d90) Line 437	C++
 	engine13.dll!Jrd::MonitoringTableScan::getFormat(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::jrd_rel * relation=0x00000000056c76a0) Line 111	C++
 	engine13.dll!Jrd::VirtualTableScan::internalOpen(Jrd::thread_db * tdbb=0x0000000000148d90) Line 57	C++
 	engine13.dll!Jrd::RecordSource::open(Jrd::thread_db * tdbb=0x0000000000148d90) Line 71	C++
 	engine13.dll!Jrd::FilteredStream::internalOpen(Jrd::thread_db * tdbb=0x0000000000148d90) Line 81	C++
 	engine13.dll!Jrd::RecordSource::open(Jrd::thread_db * tdbb=0x0000000000148d90) Line 71	C++
 	engine13.dll!Jrd::SingularStream::internalOpen(Jrd::thread_db * tdbb=0x0000000000148d90) Line 56	C++
 	engine13.dll!Jrd::RecordSource::open(Jrd::thread_db * tdbb=0x0000000000148d90) Line 71	C++
 	engine13.dll!Jrd::Cursor::open(Jrd::thread_db * tdbb=0x0000000000148d90) Line 217	C++
 	engine13.dll!Jrd::ForNode::execute(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::Request * request=0x0000000006008720, Jrd::StmtNode::ExeState * __formal=0x0000000000147838) Line 5214	C++
 	engine13.dll!EXE_looper(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::Request * request=0x0000000006008720, const Jrd::StmtNode * node=0x0000000005f644e0) Line 1473	C++
 	engine13.dll!looper_seh(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::Request * request=0x0000000006008720, const Jrd::StmtNode * node=0x0000000005f64140) Line 1605	C++
 	engine13.dll!execute_looper(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::Request * request=0x0000000006008720, Jrd::jrd_tra * transaction=0x0000000005f52850, const Jrd::StmtNode * node=0x0000000005f64140, Jrd::Request::req_s next_state=req_evaluate) Line 1057	C++
 	engine13.dll!EXE_start(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::Request * request=0x0000000006008720, Jrd::jrd_tra * transaction=0x0000000005f52850) Line 910	C++
 	engine13.dll!EXE_execute_triggers(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::TrigVector * * triggers=0x00000000056918e0, Jrd::record_param * old_rpb=0x0000000000000000, Jrd::record_param * new_rpb=0x0000000000000000, TriggerAction trigger_action=TRIGGER_CONNECT, Jrd::StmtNode::WhichTrigger which_trig=ALL_TRIGS, int ddl_action=0) Line 1255	C++
 	engine13.dll!EXE_execute_db_triggers(Jrd::thread_db * tdbb=0x0000000000148d90, Jrd::jrd_tra * transaction=0x0000000005f52850, TriggerAction trigger_action=TRIGGER_CONNECT) Line 539	C++
 	engine13.dll!Jrd::JProvider::internalAttach(Firebird::CheckStatusWrapper * user_status=0x000000000014a258, const char * const filename=0x000000000014a4fc, unsigned int dpb_length=47, const unsigned char * dpb=0x000000000014a3d8, const Jrd::UserId * existingId=0x0000000000000000) Line 2269	C++
 	engine13.dll!Jrd::JProvider::attachDatabase(Firebird::CheckStatusWrapper * user_status=0x000000000014a258, const char * filename=0x000000000014a4fc, unsigned int dpb_length=47, const unsigned char * dpb=0x000000000014a3d8) Line 1624	C++
 	engine13.dll!Firebird::IProviderBaseImpl<Jrd::JProvider,Firebird::CheckStatusWrapper,Firebird::IPluginBaseImpl<Jrd::JProvider,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IReferenceCountedImpl<Jrd::JProvider,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Jrd::JProvider,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IProvider>>>>>>>::cloopattachDatabaseDispatcher(Firebird::IProvider * self=0x00000000043d1ff8, Firebird::IStatus * status=0x000000000014ac70, const char * fileName=0x000000000014a4fc, unsigned int dpbLength=47, const unsigned char * dpb=0x000000000014a3d8) Line 12497	C++
 	fbclient.dll!Firebird::IProvider::attachDatabase<Firebird::CheckStatusWrapper>(Firebird::CheckStatusWrapper * status=0x000000000014ac68, const char * fileName=0x000000000014a4fc, unsigned int dpbLength=47, const unsigned char * dpb=0x000000000014a3d8) Line 3001	C++
 	fbclient.dll!Why::Dispatcher::attachOrCreateDatabase(Firebird::CheckStatusWrapper * status=0x000000000014ac68, bool createFlag=false, const char * filename=0x0000000000555fd0, unsigned int dpbLength=45, const unsigned char * dpb=0x000000000014add8) Line 6575	C++
 	fbclient.dll!Why::Dispatcher::attachDatabase(Firebird::CheckStatusWrapper * status=0x000000000014ac68, const char * filename=0x0000000000555fd0, unsigned int dpbLength=45, const unsigned char * dpb=0x000000000014add8) Line 6489	C++
 	fbclient.dll!Firebird::IProviderBaseImpl<Why::Dispatcher,Firebird::CheckStatusWrapper,Firebird::IPluginBaseImpl<Why::Dispatcher,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IReferenceCountedImpl<Why::Dispatcher,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Why::Dispatcher,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IProvider>>>>>>>::cloopattachDatabaseDispatcher(Firebird::IProvider * self=0x00000000001ca908, Firebird::IStatus * status=0x000000000014b290, const char * fileName=0x0000000000555fd0, unsigned int dpbLength=45, const unsigned char * dpb=0x000000000014add8) Line 12497	C++
 	srp.dll!Firebird::IProvider::attachDatabase<Firebird::CheckStatusWrapper>(Firebird::CheckStatusWrapper * status=0x000000000014b288, const char * fileName=0x0000000000555fd0, unsigned int dpbLength=45, const unsigned char * dpb=0x000000000014add8) Line 3001	C++
 	srp.dll!Auth::SrpManagement::start(Firebird::CheckStatusWrapper * status=0x000000000014b288, Firebird::ILogonInfo * logonInfo=0x000000000014b490) Line 279	C++
 	srp.dll!Firebird::IManagementBaseImpl<Auth::SrpManagement,Firebird::CheckStatusWrapper,Firebird::IPluginBaseImpl<Auth::SrpManagement,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IReferenceCountedImpl<Auth::SrpManagement,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Auth::SrpManagement,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IManagement>>>>>>>::cloopstartDispatcher(Firebird::IManagement * self=0x00000000056209d8, Firebird::IStatus * status=0x000000000014b450, Firebird::ILogonInfo * logonInfo=0x000000000014b490) Line 14218	C++
 	engine13.dll!Firebird::IManagement::start<Firebird::CheckStatusWrapper>(Firebird::CheckStatusWrapper * status=0x000000000014b448, Firebird::ILogonInfo * logonInfo=0x000000000014b490) Line 3794	C++
 	engine13.dll!Jrd::UserManagement::registerManager(Auth::Get & getPlugin={...}, const char * plugName=0x000000000014b56c) Line 197	C++
 	engine13.dll!Jrd::UserManagement::getManager(const char * name=0x0000000004cf2280) Line 240	C++
 	engine13.dll!Jrd::UserManagement::execute(unsigned short id=0) Line 370	C++
 	engine13.dll!user_management(Jrd::thread_db * __formal=0x000000000014d260, short phase=3, Jrd::DeferredWork * work=0x0000000005204740, Jrd::jrd_tra * transaction=0x00000000051f1dd0) Line 6430	C++
 	engine13.dll!DFW_perform_work(Jrd::thread_db * tdbb=0x000000000014d260, Jrd::jrd_tra * transaction=0x00000000051f1dd0) Line 5016	C++
 	engine13.dll!TRA_commit(Jrd::thread_db * tdbb=0x000000000014d260, Jrd::jrd_tra * transaction=0x00000000051f1dd0, const bool retaining_flag=false) Line 487	C++
 	engine13.dll!commit(Jrd::thread_db * tdbb=0x000000000014d260, Jrd::jrd_tra * transaction=0x00000000051f1dd0, const bool retaining_flag=false) Line 6816	C++
 	engine13.dll!JRD_commit_transaction(Jrd::thread_db * tdbb=0x000000000014d260, Jrd::jrd_tra * transaction=0x00000000051f1dd0) Line 9487	C++
 	engine13.dll!Jrd::JTransaction::internalCommit(Firebird::CheckStatusWrapper * user_status=0x000000000014d498) Line 2600	C++
 	engine13.dll!Jrd::JTransaction::commit(Firebird::CheckStatusWrapper * user_status=0x000000000014d498) Line 2569	C++
 	engine13.dll!Firebird::ITransactionBaseImpl<Jrd::JTransaction,Firebird::CheckStatusWrapper,Firebird::IReferenceCountedImpl<Jrd::JTransaction,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::IVersionedImpl<Jrd::JTransaction,Firebird::CheckStatusWrapper,Firebird::Inherit<Firebird::ITransaction>>>>>::cloopcommitDispatcher(Firebird::ITransaction * self=0x00000000043d1e08, Firebird::IStatus * status=0x000000000014d800) Line 9628	C++
 	fbclient.dll!Firebird::ITransaction::commit<Firebird::CheckStatusWrapper>(Firebird::CheckStatusWrapper * status=0x000000000014d7f8) Line 1328	C++
 	fbclient.dll!Why::YTransaction::commit::__l3::<lambda>() Line 5374	C++

Stack of the AST thread of the 1st process


 	ntdll.dll!RtlpWaitOnCriticalSection()	Unknown
 	ntdll.dll!RtlpEnterCriticalSectionContended()	Unknown
 	ntdll.dll!RtlEnterCriticalSection()	Unknown
>	engine13.dll!Firebird::Mutex::enter(const char * aReason=0x00007ffc6d734070) Line 95	C++
 	engine13.dll!Jrd::StableAttachmentPart::Sync::enter(const char * aReason=0x00007ffc6d734070) Line 231	C++
 	engine13.dll!Jrd::Attachment::SyncGuard::init(const char * f=0x00007ffc6d734070, bool optional=true) Line 1034	C++
 	engine13.dll!Jrd::Attachment::SyncGuard::SyncGuard(Jrd::StableAttachmentPart * js=0x00000000043d00f0, const char * f=0x00007ffc6d734070, bool optional=true) Line 410	C++
 	engine13.dll!Jrd::AsyncContextHolder::AsyncContextHolder(Jrd::Database * dbb=0x0000000000565750, const char * f=0x00007ffc6d734070, Jrd::Lock * lck=0x0000000004ce3cd0) Line 1100	C++
 	engine13.dll!Jrd::Attachment::blockingAstMonitor(void * ast_object=0x0000000002930050) Line 1001	C++
 	engine13.dll!Jrd::LockManager::blocking_action(Jrd::thread_db * tdbb=0x0000000000000000, long blocking_owner_offset=78328) Line 1422	C++
 	engine13.dll!Jrd::LockManager::blocking_action_thread() Line 1506	C++
 	engine13.dll!Jrd::LockManager::blocking_action_thread(Jrd::LockManager * lockMgr=0x0000000000b47490) Line 467	C++
 	engine13.dll!ThreadFinishSync<Jrd::LockManager *,0>::internalRun() Line 274	C++
 	engine13.dll!ThreadFinishSync<Jrd::LockManager *,0>::internalRun(void * arg=0x0000000000b47618) Line 267	C++
 	engine13.dll!`anonymous namespace'::ThreadArgs::run() Line 78	C++
 	engine13.dll!threadStart(void * arg=0x00000000043cffe0) Line 97	C++

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions