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++

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions