Many core dumps in pthread_getspecific.

Konstantin Belousov kostikbel at gmail.com
Sun Jul 19 20:57:28 UTC 2015


On Wed, Jul 15, 2015 at 06:32:13PM +0200, Andre Meiser wrote:
> Hi,
> 
> no crash from vim or Xorg but from xterm and again at getcontext(uc) after alloca:
> 
> % readelf -d xterm | grep NEEDED
>  0x0000000000000001 (NEEDED)             Shared library: [libXinerama.so.1]
>  0x0000000000000001 (NEEDED)             Shared library: [libXft.so.2]
>  0x0000000000000001 (NEEDED)             Shared library: [libfontconfig.so.1]
>  0x0000000000000001 (NEEDED)             Shared library: [libutil.so.9]
>  0x0000000000000001 (NEEDED)             Shared library: [libXaw.so.7]
>  0x0000000000000001 (NEEDED)             Shared library: [libXmu.so.6]
>  0x0000000000000001 (NEEDED)             Shared library: [libXt.so.6]
>  0x0000000000000001 (NEEDED)             Shared library: [libX11.so.6]
>  0x0000000000000001 (NEEDED)             Shared library: [libXpm.so.4]
>  0x0000000000000001 (NEEDED)             Shared library: [libICE.so.6]
>  0x0000000000000001 (NEEDED)             Shared library: [libulog.so.0]
>  0x0000000000000001 (NEEDED)             Shared library: [libncurses.so.8]
>  0x0000000000000001 (NEEDED)             Shared library: [libc.so.7]
> 
> 
> 
> (gdb) bt
> #0  0x0000000803038642 in check_deferred_signal (curthread=0x805006400)
>     at /usr/src/lib/libthr/thread/thr_sig.c:332
> #1  0x000000080303858d in _thr_ast (curthread=0x805006400)
>     at /usr/src/lib/libthr/thread/thr_sig.c:265
> #2  0x000000080303d367 in _thr_rtld_lock_release (lock=<value optimized out>)
>     at /usr/src/lib/libthr/thread/thr_rtld.c:162
> #3  0x000000080067d94d in _r_debug_postinit () from /libexec/ld-elf.so.1
> #4  0x000000080067b15d in .text () from /libexec/ld-elf.so.1
> #5  0x0000000000438007 in ?? ()
> #6  0x000000000043fe77 in ?? ()
> #7  0x000000000041808b in ?? ()
> #8  0x0000000000417e0a in ?? ()
> #9  0x000000000042e04a in ?? ()
> #10 0x000000000040823f in ?? ()
> #11 0x0000000800697000 in ?? ()
> #12 0x0000000000000000 in ?? ()
> 
> 
> 
> (gdb) info locals
> act = {__sigaction_u = {__sa_handler = 0x7fff00000001, 
>     __sa_sigaction = 0x7fff00000001}, sa_flags = -6472, sa_mask = {__bits = {
>       32767, 4198068, 0, 54936355}}}
> info = {si_signo = 0, si_errno = 0, si_code = -6472, si_pid = 32767, 
>   si_uid = 4294960256, si_status = 32767, si_addr = 0x800000021, si_value = {
>     sival_int = -6368, sival_ptr = 0x7fffffffe720, sigval_int = -6368, 
>     sigval_ptr = 0x7fffffffe720}, _reason = {_fault = {_trapno = 15}, 
>     _timer = {_timerid = 15, _overrun = 0}, _mesgq = {_mqd = 15}, _poll = {
>       _band = 15}, __spare__ = {__spare1__ = 15, __spare2__ = {0, 0, 6909952, 
>         8, -6496, 32767, 6806459}}}}
> 
> 
> 
> (gdb) info registers
> rax            0xf0b470 15774832
> rbx            0x805006400      34443650048
> rcx            0x0      0
> rdx            0xca0000 13238272
> rsi            0x7fffffffe6b8   140737488348856
> rdi            0x7fffff0f3150   140737472573776
> rbp            0x7fffffffe650   0x7fffffffe650
> rsp            0x7fffff0f3150   0x7fffff0f3150
> r8             0x12     18
> r9             0x7fffffffe720   140737488348960
> r10            0x4030d0 4206800
> r11            0x261    609
> r12            0x1      1
> r13            0x679320 6787872
> r14            0x7fffff0f3150   140737472573776
> r15            0x23     35
> rip            0x803038642      0x803038642 <check_deferred_signal+82>
> eflags         0x10206  66054
> cs             0x43     67
> ss             0x3b     59
> ds             0x0      0
> es             0x0      0
> fs             0x0      0
> gs             0x0      0
> 
> 
> 
> (gdb) disassemble
> Dump of assembler code for function check_deferred_signal:
> 0x00000008030385f0 <check_deferred_signal+0>:   push   %rbp
> 0x00000008030385f1 <check_deferred_signal+1>:   mov    %rsp,%rbp
> 0x00000008030385f4 <check_deferred_signal+4>:   push   %r15
> 0x00000008030385f6 <check_deferred_signal+6>:   push   %r14
> 0x00000008030385f8 <check_deferred_signal+8>:   push   %rbx
> 0x00000008030385f9 <check_deferred_signal+9>:   sub    $0x78,%rsp
> 0x00000008030385fd <check_deferred_signal+13>:  mov    %rdi,%rbx
> 0x0000000803038600 <check_deferred_signal+16>:  cmpl   $0x0,0x100(%rbx)
> 0x0000000803038607 <check_deferred_signal+23>:  je     0x803038612 <check_deferred_signal+34>
> 0x0000000803038609 <check_deferred_signal+25>:  cmpl   $0x0,0x180(%rbx)
> 0x0000000803038610 <check_deferred_signal+32>:  je     0x80303861d <check_deferred_signal+45>
> 0x0000000803038612 <check_deferred_signal+34>:  lea    -0x18(%rbp),%rsp
> 0x0000000803038616 <check_deferred_signal+38>:  pop    %rbx
> 0x0000000803038617 <check_deferred_signal+39>:  pop    %r14
> 0x0000000803038619 <check_deferred_signal+41>:  pop    %r15
> 0x000000080303861b <check_deferred_signal+43>:  pop    %rbp
> 0x000000080303861c <check_deferred_signal+44>:  retq   
> 0x000000080303861d <check_deferred_signal+45>:  movl   $0x1,0x180(%rbx)
> 0x0000000803038627 <check_deferred_signal+55>:  callq  0x803032dfc <__getcontextx_size at plt>
> 0x000000080303862c <check_deferred_signal+60>:  cltq   
> 0x000000080303862e <check_deferred_signal+62>:  mov    %rsp,%r14
> 0x0000000803038631 <check_deferred_signal+65>:  add    $0xf,%rax
> 0x0000000803038635 <check_deferred_signal+69>:  and    $0xfffffffffffffff0,%rax
> 0x0000000803038639 <check_deferred_signal+73>:  sub    %rax,%r14
> 0x000000080303863c <check_deferred_signal+76>:  mov    %r14,%rsp
> 0x000000080303863f <check_deferred_signal+79>:  mov    %r14,%rdi
> 0x0000000803038642 <check_deferred_signal+82>:  callq  0x8030331cc <getcontext at plt>
> 0x0000000803038647 <check_deferred_signal+87>:  cmpl   $0x0,0x100(%rbx)
> 0x000000080303864e <check_deferred_signal+94>:  je     0x8030386db <check_deferred_signal+235>
> 0x0000000803038654 <check_deferred_signal+100>: lea    0x100(%rbx),%r15
> 0x000000080303865b <check_deferred_signal+107>: mov    %r14,%rdi
> 0x000000080303865e <check_deferred_signal+110>: callq  0x80303301c <__fillcontextx2 at plt>
> 0x0000000803038663 <check_deferred_signal+115>: movups 0x160(%rbx),%xmm0
> 0x000000080303866a <check_deferred_signal+122>: movups 0x170(%rbx),%xmm1
> 0x0000000803038671 <check_deferred_signal+129>: movaps %xmm1,-0x30(%rbp)
> 0x0000000803038675 <check_deferred_signal+133>: movaps %xmm0,-0x40(%rbp)
> 0x0000000803038679 <check_deferred_signal+137>: movups 0x150(%rbx),%xmm0
> 0x0000000803038680 <check_deferred_signal+144>: movups %xmm0,(%r14)
> 0x0000000803038684 <check_deferred_signal+148>: movups 0x40(%r15),%xmm0
> 0x0000000803038689 <check_deferred_signal+153>: movaps %xmm0,-0x50(%rbp)
> 0x000000080303868d <check_deferred_signal+157>: movups (%r15),%xmm0
> 0x0000000803038691 <check_deferred_signal+161>: movups 0x10(%r15),%xmm1
> 0x0000000803038696 <check_deferred_signal+166>: movups 0x20(%r15),%xmm2
> 0x000000080303869b <check_deferred_signal+171>: movups 0x30(%r15),%xmm3
> 0x00000008030386a0 <check_deferred_signal+176>: movaps %xmm3,-0x60(%rbp)
> 0x00000008030386a4 <check_deferred_signal+180>: movaps %xmm2,-0x70(%rbp)
> 0x00000008030386a8 <check_deferred_signal+184>: movaps %xmm1,-0x80(%rbp)
> 0x00000008030386ac <check_deferred_signal+188>: movaps %xmm0,-0x90(%rbp)
> 0x00000008030386b3 <check_deferred_signal+195>: movl   $0x0,0x100(%rbx)
> 0x00000008030386bd <check_deferred_signal+205>: mov    -0x90(%rbp),%esi
> 0x00000008030386c3 <check_deferred_signal+211>: lea    -0x40(%rbp),%rdi
> 0x00000008030386c7 <check_deferred_signal+215>: lea    -0x90(%rbp),%rdx
> 0x00000008030386ce <check_deferred_signal+222>: mov    %r14,%rcx
> 0x00000008030386d1 <check_deferred_signal+225>: callq  0x803039330 <handle_signal>
> 0x00000008030386d6 <check_deferred_signal+230>: jmpq   0x803038612 <check_deferred_signal+34>
> 0x00000008030386db <check_deferred_signal+235>: movl   $0x0,0x180(%rbx)
> 0x00000008030386e5 <check_deferred_signal+245>: jmpq   0x803038612 <check_deferred_signal+34>
> End of assembler dump.
> 
> 
> I like the system, but this thread library smells fishy... :(

It seems that besides sigreturn(), ucontext symbols must be pre-resolved
as well.  Try this update (it includes the previous change).

diff --git a/lib/libthr/thread/thr_rtld.c b/lib/libthr/thread/thr_rtld.c
index 5d89988..cb20098 100644
--- a/lib/libthr/thread/thr_rtld.c
+++ b/lib/libthr/thread/thr_rtld.c
@@ -185,7 +185,9 @@ _thr_rtld_init(void)
 {
 	struct RtldLockInfo	li;
 	struct pthread		*curthread;
+	ucontext_t *uc;
 	long dummy = -1;
+	int uc_len;
 
 	curthread = _get_curthread();
 
@@ -231,4 +233,9 @@ _thr_rtld_init(void)
 	_thr_signal_block(curthread);
 	_rtld_thread_init(&li);
 	_thr_signal_unblock(curthread);
+
+	uc_len = __getcontextx_size();
+	uc = alloca(uc_len);
+	getcontext(uc);
+	__fillcontextx2((char *)uc);
 }
diff --git a/lib/libthr/thread/thr_sig.c b/lib/libthr/thread/thr_sig.c
index a6d021f..ebb6c58 100644
--- a/lib/libthr/thread/thr_sig.c
+++ b/lib/libthr/thread/thr_sig.c
@@ -30,6 +30,7 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/signalvar.h>
+#include <sys/syscall.h>
 #include <signal.h>
 #include <errno.h>
 #include <stdlib.h>
@@ -257,7 +258,7 @@ handle_signal(struct sigaction *actp, int sig, siginfo_t *info, ucontext_t *ucp)
 	/* reschedule cancellation */
 	check_cancel(curthread, &uc2);
 	errno = err;
-	__sys_sigreturn(&uc2);
+	syscall(SYS_sigreturn, &uc2);
 }
 
 void


More information about the freebsd-stable mailing list