Skip to content

Launcher crashes on exit when cell name loading thread is still running

Call stack:

Click to expand
>	[Inline Frame] openmw-launcher.exe!std::_Hash<std::_Uset_traits<std::string,std::_Uhash_compare<std::string,Misc::StringUtils::CiHash,Misc::StringUtils::CiEqual>,std::allocator<std::string>,0>>::_Find_last(const std::basic_string_view<char,std::char_traits<char>> &) Line 1541	C++
 	[Inline Frame] openmw-launcher.exe!std::_Hash<std::_Uset_traits<std::string,std::_Uhash_compare<std::string,Misc::StringUtils::CiHash,Misc::StringUtils::CiEqual>,std::allocator<std::string>,0>>::_Find(const std::basic_string_view<char,std::char_traits<char>> &) Line 1218	C++
 	openmw-launcher.exe!std::_Hash<std::_Uset_traits<std::string,std::_Uhash_compare<std::string,Misc::StringUtils::CiHash,Misc::StringUtils::CiEqual>,std::allocator<std::string>,0>>::find<std::basic_string_view<char,std::char_traits<char>>>(const std::basic_string_view<char,std::char_traits<char>> & _Keyval={...}) Line 1230	C++
 	openmw-launcher.exe!ESM::`anonymous namespace'::getOrInsertString(std::basic_string_view<char,std::char_traits<char>> id={...}) Line 34	C++
 	openmw-launcher.exe!ESM::StringRefId::StringRefId(std::basic_string_view<char,std::char_traits<char>> value) Line 60	C++
 	openmw-launcher.exe!ESM::RefId::stringRefId(std::basic_string_view<char,std::char_traits<char>> value) Line 148	C++
 	openmw-launcher.exe!ESM::Cell::generateIdForCell(bool exterior, std::basic_string_view<char,std::char_traits<char>> cellName, int x, int y=0x3f800000) Line 90	C++
 	openmw-launcher.exe!ESM::Cell::updateId() Line 76	C++
 	openmw-launcher.exe!ESM::Cell::loadNameAndData(ESM::ESMReader & esm={...}, bool & isDeleted=false) Line 126	C++
 	openmw-launcher.exe!CellNameLoader::getCellName(ESM::ESMReader & esmReader={...}) Line 74	C++
 	openmw-launcher.exe!CellNameLoader::getCellNames(const QList<QString> & contentPaths={...}) Line 43	C++
 	openmw-launcher.exe!Launcher::DataFilesPage::reloadCells(QList<QString> selectedFiles={...}) Line 1014	C++
 	[Inline Frame] openmw-launcher.exe!std::invoke(void(Launcher::DataFilesPage::*)(QList<QString>) &&) Line 1712	C++
 	openmw-launcher.exe!std::thread::_Invoke<std::tuple<void (__cdecl Launcher::DataFilesPage::*)(QList<QString>),Launcher::DataFilesPage *,QList<QString>>,0,1,2>(void * _RawVals=0x00000194a64541c0) Line 61	C++
 	ucrtbase.dll!thread_start<unsigned int (__cdecl*)(void *),1>()	Unknown
 	kernel32.dll!BaseThreadInitThunk()	Unknown
 	ntdll.dll!RtlUserThreadStart()	Unknown

A bad pointer is accessed and it looks like we've torn down something that the thread's still using. We should have some way of aborting the thread before destroying the rest of the launcher.