Date: Wed, 22 Oct 1997 14:45:01 -0400 From: Tad Hunt <tad@mcp.csh.rit.edu> To: freebsd-hackers@freebsd.org Subject: -lc_r and setjmp (BUG) Message-ID: <199710221846.OAA01419@jake.csh.rit.edu>
index | next in thread | raw e-mail
I was looking at the libc_r implementation of setjmp
(lib/libc_r/uthread/uthread_setjmp.c) from (FreeBSD-2.2.5-101897)
from lib/libc_r/uthread/uthread_setjmp.c:
int
setjmp(jmp_buf env)
{
return (_thread_sys_setjmp(env));
}
where _thread_sys_setjmp is implemented in lib/libc/i386/gen/setjmp.S
as something like the following:
#ifdef _THREAD_SAFE
ENTRY(_thread_sys_setjmp)
#else
ENTRY(setjmp)
#endif
[... essentially the same implementation for both cases, except
for some signal stuff]
In the case of threaded programs calling setjmp() (instead of calling
_thread_sys_setjmp()) the wrong environment gets saved in the jmp_buf.
When longjmp does it's work, it returns into setjmp() (instead of returning
into the caller of setjmp(). Essentially the following is happening:
jmp_buf foo;
main()
{
bar();
longjmp(foo, 1);
}
bar()
{
setjmp(foo);
}
-Tad
P.S. I don't know if this is the right place to report the bug, please
redirect me if necessary.
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199710221846.OAA01419>
