Segmentation fault in malloc_usable_size() (libc)
David Xu
davidxu at freebsd.org
Tue Sep 9 04:06:00 UTC 2008
Jason Evans wrote:
> Jille Timmermans wrote:
>> I switched over to current a fews days ago.
>> And I ran into a bug (file attached, log pasted):
>
> The stack trace you got is totally bogus, but the problem is real. This
> crash is due to recent changes in malloc that use TLS for
> thread-specific caching. The problem is that malloc is being used after
> a thread has effectively exited.
>
> #0 0x00000008007c7b35 in arena_malloc (arena=0x500a98, size=80,
> zero=true) at /usr/src/lib/libc/stdlib/malloc.c:3223
> #1 0x00000008007caf4b in calloc (num=1, size=80) at
> /usr/src/lib/libc/stdlib/malloc.c:3395
> #2 0x0000000800649c94 in mutex_init (mutex=0x8009785c0,
> mutex_attr=Variable "mutex_attr" is not available.
> ) at /usr/src/lib/libthr/thread/thr_mutex.c:144
> #3 0x0000000800649f41 in init_static (thread=0x608e40,
> mutex=0x8009785c0) at /usr/src/lib/libthr/thread/thr_mutex.c:188
> #4 0x000000080064ab31 in __pthread_mutex_lock (mutex=0x8009785c0) at
> /usr/src/lib/libthr/thread/thr_mutex.c:445
> #5 0x000000080081c63c in __cxa_finalize (dso=0x0) at
> /usr/src/lib/libc/stdlib/atexit.c:161
> #6 0x00000008007ccbe7 in exit (status=0) at
> /usr/src/lib/libc/stdlib/exit.c:67
> #7 0x000000080064e5c6 in _pthread_exit (status=Variable "status" is not
> available.
> ) at /usr/src/lib/libthr/thread/thr_exit.c:109
> #8 0x0000000800646219 in thread_start (curthread=0x608e40) at
> /usr/src/lib/libthr/thread/thr_create.c:288
> #9 0x0000000000000000 in ?? ()
>
> The call to _malloc_thread_cleanup() in _pthread_exit() I added at
> /usr/src/lib/libthr/thread/thr_exit.c:100 is too early in the case that
> _thread_active_threads is decremented to 0 below. I don't know off the
> top of my head what the best fix is (i.e. where the
> _malloc_thread_cleanup() call is really safe); perhaps David Xu has a
> suggestion.
>
> Thanks,
> Jason
>
I propose following patch:
Index: thread/thr_exit.c
===================================================================
--- thread/thr_exit.c (版本 182882)
+++ thread/thr_exit.c (工作副本)
@@ -96,9 +96,6 @@
_thread_cleanupspecific();
}
- /* Tell malloc that the thread is exiting. */
- _malloc_thread_cleanup();
-
if (!_thr_isthreaded())
exit(0);
@@ -109,6 +106,12 @@
exit(0);
/* Never reach! */
}
+ THREAD_LIST_UNLOCK(curthread);
+
+ /* Tell malloc that the thread is exiting. */
+ _malloc_thread_cleanup();
+
+ THREAD_LIST_LOCK(curthread);
THR_LOCK(curthread);
curthread->state = PS_DEAD;
if (curthread->flags & THR_FLAGS_NEED_SUSPEND) {
More information about the freebsd-current
mailing list