Systematic crash on openSUSE Leap 15.5
I first noticed this bug while doing tests for the migration to Qt 6.6.1, but in fact it also occurs with Qt 6.5.3:
- OS: openSUSE Leap 15.5 (in a VM, with GNOME/Wayland)
- Jami version: 202401241341 (from dl.jami.net/nightly)
The problem seems to only occur on Leap 15.5 specifically; I also tried on 15.4 and everything seemed fine with both Qt 6.6.1 and Qt 6.5.3.
Scenario
- Alice opens Jami and sends an invitation to Bob
- She waits until Bob has received the invitation
At this point, Alice will sometimes get a crash (segmentation fault) without doing anything more:
Thread 86 "jami" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fff07fff700 (LWP 3789)]
0x00007fffe839e63b in _int_free () from /lib64/libc.so.6
(gdb) bt
#0 0x00007fffe839e63b in _int_free () from /lib64/libc.so.6
#1 0x00007fffdde0c4d8 in asn1_delete_structure2 () from /usr/lib64/libtasn1.so.6
#2 0x00007fffe18deba9 in gnutls_x509_crt_deinit () from /usr/lib64/libgnutls.so.30
#3 0x00007fffe18e3f70 in gnutls_x509_crt_list_import () from /usr/lib64/libgnutls.so.30
#4 0x00007fffe18e438b in gnutls_x509_crt_list_import2 () from /usr/lib64/libgnutls.so.30
#5 0x00007fffe9077076 in dht::crypto::Certificate::unpack(unsigned char const*, unsigned long) () from /usr/lib64/libjami.so.0
#6 0x00007fffe9078a24 in dht::crypto::Certificate::Certificate(std::vector<unsigned char, std::allocator<unsigned char> > const&) () from /usr/lib64/libjami.so.0
#7 0x00007fffe8ce5f3e in jami::ConversationRepository::Impl::validateDevice() () from /usr/lib64/libjami.so.0
#8 0x00007fffe8cf28ad in jami::ConversationRepository::Impl::commit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) ()
from /usr/lib64/libjami.so.0
#9 0x00007fffe8cf31ff in jami::ConversationRepository::commitMessage(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) ()
from /usr/lib64/libjami.so.0
#10 0x00007fffe8cc254d in jami::Conversation::sendMessage(Json::Value&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>&&, std::function<void (bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>&&)::{lambda()#1}::operator()() const () from /usr/lib64/libjami.so.0
#11 0x00007fffe90acd52 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<dht::ThreadPool::run(std::function<void ()>&&)::{lambda()#1}> > >::_M_run() ()
from /usr/lib64/libjami.so.0
#12 0x00007fffe872b713 in ?? () from /usr/lib64/libstdc++.so.6
#13 0x00007fffeb6626ea in start_thread () from /lib64/libpthread.so.0
#14 0x00007fffe841c50f in clone () from /lib64/libc.so.6
- (assuming there was no crash at the previous step) Alice tries to send a message to Bob
As far as I can tell, this always leads to a crash:
Thread 68 "jami" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffefcff9700 (LWP 6736)]
0x00007fffdde0ac78 in ?? () from /usr/lib64/libtasn1.so.6
Missing separate debuginfos, use: zypper install jami-debuginfo-20240124.0-1.x86_64
#0 0x00007fffdde0ac78 in ?? () from /usr/lib64/libtasn1.so.6
#1 0x00007fffdde0c431 in asn1_delete_structure2 () from /usr/lib64/libtasn1.so.6
#2 0x00007fffe18deba9 in gnutls_x509_crt_deinit () from /usr/lib64/libgnutls.so.30
#3 0x00007fffe18e3f70 in gnutls_x509_crt_list_import () from /usr/lib64/libgnutls.so.30
#4 0x00007fffe18e438b in gnutls_x509_crt_list_import2 () from /usr/lib64/libgnutls.so.30
#5 0x00007fffe9077076 in dht::crypto::Certificate::unpack(unsigned char const*, unsigned long) () from /usr/lib64/libjami.so.0
#6 0x00007fffe9078a24 in dht::crypto::Certificate::Certificate(std::vector<unsigned char, std::allocator<unsigned char> > const&) () from /usr/lib64/libjami.so.0
#7 0x00007fffe8ce5f3e in jami::ConversationRepository::Impl::validateDevice() () from /usr/lib64/libjami.so.0
#8 0x00007fffe8cf28ad in jami::ConversationRepository::Impl::commit(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) ()
from /usr/lib64/libjami.so.0
#9 0x00007fffe8cf31ff in jami::ConversationRepository::commitMessage(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool) ()
from /usr/lib64/libjami.so.0
#10 0x00007fffe8cc254d in jami::Conversation::sendMessage(Json::Value&&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::function<void (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>&&, std::function<void (bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)>&&)::{lambda()#1}::operator()() const () from /usr/lib64/libjami.so.0
#11 0x00007fffe90acd52 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<dht::ThreadPool::run(std::function<void ()>&&)::{lambda()#1}> > >::_M_run() ()
from /usr/lib64/libjami.so.0
#12 0x00007fffe872b713 in ?? () from /usr/lib64/libstdc++.so.6
#13 0x00007fffeb6626ea in start_thread () from /lib64/libpthread.so.0
#14 0x00007fffe841c50f in clone () from /lib64/libc.so.6
- Alice reopens Jami after it crashed and clicks on the conversation with Bob
This typically leads to Jami crashing again, this time due to an exception instead of a segfault:
terminate called after throwing an instance of 'dht::crypto::CryptoException'
what(): Can't compute hash: An error has been detected in the library and cannot continue operations.
Thread 69 "jami" received signal SIGABRT, Aborted.
[Switching to Thread 0x7ffef4ff9700 (LWP 4283)]
0x00007fffe834ed2b in raise () from /lib64/libc.so.6
#0 0x00007fffe834ed2b in raise () from /lib64/libc.so.6
#1 0x00007fffe83503e5 in abort () from /lib64/libc.so.6
#2 0x00007fffe86ef4a7 in ?? () from /usr/lib64/libstdc++.so.6
#3 0x00007fffe86fec1c in ?? () from /usr/lib64/libstdc++.so.6
#4 0x00007fffe86fec87 in std::terminate() () from /usr/lib64/libstdc++.so.6
#5 0x00007fffe86feee8 in __cxa_throw () from /usr/lib64/libstdc++.so.6
#6 0x00007fffe8ad4875 in dht::crypto::hash(unsigned char const*, unsigned long, unsigned char*, unsigned long) [clone .cold] () from /usr/lib64/libjami.so.0
#7 0x00007fffe8d674fc in jami::AccountManager::startSync(std::function<void (std::shared_ptr<dht::crypto::Certificate> const&)> const&, std::function<void ()> const&, bool) ()
from /usr/lib64/libjami.so.0
#8 0x00007fffe8d83f0f in jami::ArchiveAccountManager::startSync(std::function<void (std::shared_ptr<dht::crypto::Certificate> const&)> const&, std::function<void ()> const&, bool) () from /usr/lib64/libjami.so.0
#9 0x00007fffe8c3ba43 in std::_Function_handler<void (bool), jami::JamiAccount::doRegister_()::{lambda(bool)#7}>::_M_invoke(std::_Any_data const&, bool&&) ()
from /usr/lib64/libjami.so.0
#10 0x00007fffe9196629 in std::_Function_handler<void (bool), dht::SecureDht::SecureDht(std::unique_ptr<dht::DhtInterface, std::default_delete<dht::DhtInterface> >, dht::SecureDhtConfig, std::function<void (bool)>, std::shared_ptr<dht::log::Logger> const&)::{lambda()#1}::operator()() const::{lambda(bool)#1}>::_M_invoke(std::_Any_data const&, bool&&) ()
from /usr/lib64/libjami.so.0
#11 0x00007fffe908c3e0 in std::_Function_handler<void (bool, std::vector<std::shared_ptr<dht::Node>, std::allocator<std::shared_ptr<dht::Node> > > const&), std::_Bind<std::function<void (bool)> (std::_Placeholder<1>)> >::_M_invoke(std::_Any_data const&, bool&&, std::vector<std::shared_ptr<dht::Node>, std::allocator<std::shared_ptr<dht::Node> > > const&)
() from /usr/lib64/libjami.so.0
#12 0x00007fffe9139a20 in std::_Function_handler<void (bool, std::vector<std::shared_ptr<dht::Node>, std::allocator<std::shared_ptr<dht::Node> > > const&), dht::Dht::put(dht::Hash<20ul> const&, std::shared_ptr<dht::Value>, std::function<void (bool, std::vector<std::shared_ptr<dht::Node>, std::allocator<std::shared_ptr<dht::Node> > > const&)>, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > >, bool)::{lambda(bool, std::vector<std::shared_ptr<dht::Node>, std::allocator<std::shared_ptr<dht::Node> > > const&)#2}>::_M_invoke(std::_Any_data const&, bool&&, std::vector<std::shared_ptr<dht::Node>, std::allocator<std::shared_ptr<dht::Node> > > const&) () from /usr/lib64/libjami.so.0
#13 0x00007fffe915f27b in dht::Dht::Search::checkAnnounced(unsigned long) () from /usr/lib64/libjami.so.0
#14 0x00007fffe914608c in dht::Dht::searchStep(std::weak_ptr<dht::Dht::Search>) () from /usr/lib64/libjami.so.0
#15 0x00007fffe915c265 in std::_Function_handler<void (), std::_Bind<void (dht::Dht::*(dht::Dht*, std::weak_ptr<dht::Dht::Search>))(std::weak_ptr<dht::Dht::Search>)> >::_M_invoke(std::_Any_data const&) () from /usr/lib64/libjami.so.0
#16 0x00007fffe91391f5 in dht::Dht::periodic(unsigned char const*, unsigned long, dht::SockAddr, std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long, std::ratio<1l, 1000000000l> > > const&) () from /usr/lib64/libjami.so.0
#17 0x00007fffe909f455 in dht::DhtRunner::loop_() () from /usr/lib64/libjami.so.0
#18 0x00007fffe909f556 in std::thread::_State_impl<std::thread::_Invoker<std::tuple<dht::DhtRunner::run(dht::DhtRunner::Config const&, dht::DhtRunner::Context&&)::{lambda()#2}> > >::_M_run() () from /usr/lib64/libjami.so.0
#19 0x00007fffe872b713 in ?? () from /usr/lib64/libstdc++.so.6
#20 0x00007fffeb6626ea in start_thread () from /lib64/libpthread.so.0
#21 0x00007fffe841c50f in clone () from /lib64/libc.so.6
Note: The above crashes occur regardless of whether Bob accepted Alice's invitation or not. If he does accept it, then he sees a message similar to the following (even though Alice is already connected):