Date: Sun, 12 Jan 2025 13:31:08 +0200 From: Konstantin Belousov <kostikbel@gmail.com> To: Yuri <yuri@freebsd.org> Cc: Freebsd hackers list <freebsd-hackers@freebsd.org> Subject: Re: pthread_mutex_trylock crashes because _get_curthread() returns null Message-ID: <Z4On_KSHfMRpi4RU@kib.kiev.ua> In-Reply-To: <cf547d6a-fcee-4629-87d4-41e0da63dd79@FreeBSD.org> References: <cf547d6a-fcee-4629-87d4-41e0da63dd79@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Jan 11, 2025 at 07:35:51PM -0800, Yuri wrote: > I am trying to understand this crash: > > 614│ int > 615│ __Tthr_mutex_trylock(pthread_mutex_t *mutex) > 616│ { > 617│ struct pthread *curthread; > 618│ struct pthread_mutex *m; > 619│ uint32_t id; > 620│ int ret, robust; > 621│ > 622│ ret = check_and_init_mutex(mutex, &m); > 623│ if (ret != 0) > 624│ return (ret); > 625│ curthread = _get_curthread(); > 626│ id = TID(curthread); > 627│ if (m->m_flags & PMUTEX_FLAG_PRIVATE) > 628├───────────────> THR_CRITICAL_ENTER(curthread); > > Program received signal SIGSEGV, Segmentation fault. > Address not mapped to object. > __Tthr_mutex_trylock (mutex=<optimized out>) at > /disk-samsung/freebsd-src/lib/libthr/thread/thr_mutex.c:628 > 628 THR_CRITICAL_ENTER(curthread); > > The crash occurs at the program startup within the pthread_mutex_trylock() > function. > > The immediate cause is that _get_curthread() returned null in curthread. > > > Testcase: the port databases/qdrant at rev. > e7cee8d22daf5b6360238cad603ca9f96ecd87fd (at version 1.12.5). > > > How can it be that _get_curthread() returns null? > > Shouldn't current thread be always defined? The following patch should help, please check commit fb77577e7a4995f038a5d28f42d4c3771e536fdb Author: Konstantin Belousov <kib@FreeBSD.org> Date: Sun Jan 12 13:28:52 2025 +0200 pthread_mutex_trylock(): init libthr if needed Sponsored by: The FreeBSD Foundation MFC after: 1 week diff --git a/lib/libthr/thread/thr_mutex.c b/lib/libthr/thread/thr_mutex.c index ca8971cc720a..32bdc4afe65f 100644 --- a/lib/libthr/thread/thr_mutex.c +++ b/lib/libthr/thread/thr_mutex.c @@ -619,6 +619,7 @@ __Tthr_mutex_trylock(pthread_mutex_t *mutex) uint32_t id; int ret, robust; + _thr_check_init(); ret = check_and_init_mutex(mutex, &m); if (ret != 0) return (ret);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Z4On_KSHfMRpi4RU>