about summary refs log tree commit diff
path: root/nptl/pt-longjmp.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-12-19 01:37:13 +0000
committerUlrich Drepper <drepper@redhat.com>2003-12-19 01:37:13 +0000
commit675620f74c6fd1233ab57c19a3b1c6279e782c09 (patch)
tree7e2b24adbcf086227800b7d6164cf0b15645647f /nptl/pt-longjmp.c
parent3434f152228af9fa619de254559815363f86868a (diff)
downloadglibc-675620f74c6fd1233ab57c19a3b1c6279e782c09.tar.gz
glibc-675620f74c6fd1233ab57c19a3b1c6279e782c09.tar.xz
glibc-675620f74c6fd1233ab57c19a3b1c6279e782c09.zip
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.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/nptl/pt-longjmp.c b/nptl/pt-longjmp.c
index f217e307f9..2022386c5b 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;