diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-12-19 01:37:13 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-12-19 01:37:13 +0000 |
commit | 675620f74c6fd1233ab57c19a3b1c6279e782c09 (patch) | |
tree | 7e2b24adbcf086227800b7d6164cf0b15645647f /nptl/pt-longjmp.c | |
parent | 3434f152228af9fa619de254559815363f86868a (diff) | |
download | glibc-675620f74c6fd1233ab57c19a3b1c6279e782c09.zip glibc-675620f74c6fd1233ab57c19a3b1c6279e782c09.tar.gz glibc-675620f74c6fd1233ab57c19a3b1c6279e782c09.tar.bz2 |
Update.
2003-12-18 Ulrich Drepper <drepper@redhat.com>
* tst-eintr1.c: Better error messages.
* Makefile (tests): Add tst-eintr2.
* tst-eintr2.c: New file.
2003-12-18 Jakub Jelinek <jakub@redhat.com>
* Makefile (tests): Add tst-cancel21 and tst-cancelx21.
(CFLAGS-tst-cancelx21.c): Set.
* tst-cancel21.c: New test.
* tst-cancelx21.c: New test.
* unwind.c (FRAME_LEFT): Add adj argument. Subtract it from each
comparison operand.
(unwind_stop): Use _JMPBUF_CFA_UNWINDS_ADJ macro instead of
_JMPBUF_CFA_UNWINDS. Adjust FRAME_LEFT invocations.
* pt-longjmp.c: Include jmpbuf-unwind.h.
(__pthread_cleanup_upto): Use _JMPBUF_UNWINDS_ADJ macro instead of
_JMPBUF_UNWINDS. Adjust compared pointers.
* init.c (__pthread_initialize_minimal_internal): Initialize
pd->stackblock_size.
* sysdeps/pthread/jmpbuf-unwind.h: Removed.
* sysdeps/alpha/jmpbuf-unwind.h: New file.
* sysdeps/i386/jmpbuf-unwind.h: New file.
* sysdeps/powerpc/jmpbuf-unwind.h: New file.
* sysdeps/s390/jmpbuf-unwind.h: New file.
* sysdeps/sh/jmpbuf-unwind.h: New file.
* sysdeps/sparc/sparc32/jmpbuf-unwind.h: New file.
* sysdeps/x86_64/jmpbuf-unwind.h: New file.
* sysdeps/ia64/jmpbuf-unwind.h: Include stdint.h.
(_JMPBUF_CFA_UNWINDS): Remove.
(_JMPBUF_CFA_UNWINDS_ADJ, _JMPBUF_UNWINDS_ADJ): Define.
2003-12-12 Jakub Jelinek <jakub@redhat.com>
* Makefile (tests): Add tst-cancel20 and tst-cancelx20.
(CFLAGS-tst-cancelx20.c): Set.
* tst-cancel20.c: New test.
* tst-cancelx20.c: New test.
Diffstat (limited to 'nptl/pt-longjmp.c')
-rw-r--r-- | nptl/pt-longjmp.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/nptl/pt-longjmp.c b/nptl/pt-longjmp.c index f217e30..2022386 100644 --- a/nptl/pt-longjmp.c +++ b/nptl/pt-longjmp.c @@ -20,7 +20,7 @@ #include <setjmp.h> #include <stdlib.h> #include "pthreadP.h" - +#include "jmpbuf-unwind.h" void __pthread_cleanup_upto (__jmp_buf target, char *targetframe) @@ -28,18 +28,24 @@ __pthread_cleanup_upto (__jmp_buf target, char *targetframe) struct pthread *self = THREAD_SELF; struct _pthread_cleanup_buffer *cbuf; + /* Adjust all pointers used in comparisons, so that top of thread's + stack is at the top of address space. Without that, things break + if stack is allocated above the main stack. */ + uintptr_t adj = (uintptr_t) self->stackblock + self->stackblock_size; + uintptr_t targetframe_adj = (uintptr_t) targetframe - adj; + for (cbuf = THREAD_GETMEM (self, cleanup); - cbuf != NULL && _JMPBUF_UNWINDS (target, cbuf); + cbuf != NULL && _JMPBUF_UNWINDS_ADJ (target, cbuf, adj); cbuf = cbuf->__prev) { #if _STACK_GROWS_DOWN - if ((char *) cbuf <= targetframe) + if ((uintptr_t) cbuf - adj <= targetframe_adj) { cbuf = NULL; break; } #elif _STACK_GROWS_UP - if ((char *) cbuf >= targetframe) + if ((uintptr_t) cbuf - adj >= targetframe_adj) { cbuf = NULL; break; |