* ctype/ctype.h (__ctype_b, __ctype_toupper, __ctype_tolower):
[platform/upstream/glibc.git] / linuxthreads / ptlongjmp.c
index 7e4314e..1859254 100644 (file)
@@ -31,11 +31,29 @@ static void pthread_cleanup_upto(__jmp_buf target)
 {
   pthread_descr self = thread_self();
   struct _pthread_cleanup_buffer * c;
+  char *currentframe = CURRENT_STACK_FRAME;
 
   for (c = THREAD_GETMEM(self, p_cleanup);
        c != NULL && _JMPBUF_UNWINDS(target, c);
-       c = c->prev)
-    c->routine(c->arg);
+       c = c->__prev)
+    {
+#if _STACK_GROWS_DOWN
+      if ((char *) c <= currentframe)
+       {
+         c = NULL;
+         break;
+       }
+#elif _STACK_GROWS_UP
+      if ((char *) c >= currentframe)
+       {
+         c = NULL;
+         break;
+       }
+#else
+# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
+#endif
+      c->__routine(c->__arg);
+    }
   THREAD_SETMEM(self, p_cleanup, c);
   if (THREAD_GETMEM(self, p_in_sighandler)
       && _JMPBUF_UNWINDS(target, THREAD_GETMEM(self, p_in_sighandler)))