svn commit: trunk/uClibc/libpthread/linuxthreads.old

vapier at uclibc.org vapier at uclibc.org
Thu Nov 9 08:07:43 UTC 2006


Author: vapier
Date: 2006-11-09 00:07:43 -0800 (Thu, 09 Nov 2006)
New Revision: 16523

Log:
backport from upstream:
2001-04-11  Ulrich Drepper  <drepper at redhat.com>

    * cancel.c (_pthread_cleanup_push): Catch invalid __prev buffer
    and remove it.
    (_pthread_cleanup_push_defer): Likewise.


Modified:
   trunk/uClibc/libpthread/linuxthreads.old/cancel.c
   trunk/uClibc/libpthread/linuxthreads.old/internals.h


Changeset:
Modified: trunk/uClibc/libpthread/linuxthreads.old/cancel.c
===================================================================
--- trunk/uClibc/libpthread/linuxthreads.old/cancel.c	2006-11-09 00:00:12 UTC (rev 16522)
+++ trunk/uClibc/libpthread/linuxthreads.old/cancel.c	2006-11-09 08:07:43 UTC (rev 16523)
@@ -26,7 +26,15 @@
 extern void __rpc_thread_destroy(void);
 #endif
 
+#ifdef _STACK_GROWS_DOWN
+# define FRAME_LEFT(frame, other) ((char *) frame >= (char *) other)
+#elif _STACK_GROWS_UP
+# define FRAME_LEFT(frame, other) ((char *) frame <= (char *) other)
+#else
+# error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP"
+#endif
 
+
 int pthread_setcancelstate(int state, int * oldstate)
 {
   pthread_descr self = thread_self();
@@ -128,6 +136,8 @@
   buffer->__routine = routine;
   buffer->__arg = arg;
   buffer->__prev = THREAD_GETMEM(self, p_cleanup);
+  if (buffer->__prev != NULL && FRAME_LEFT (buffer, buffer->__prev))
+    buffer->__prev = NULL;
   THREAD_SETMEM(self, p_cleanup, buffer);
 }
 
@@ -147,6 +157,8 @@
   buffer->__arg = arg;
   buffer->__canceltype = THREAD_GETMEM(self, p_canceltype);
   buffer->__prev = THREAD_GETMEM(self, p_cleanup);
+  if (buffer->__prev != NULL && FRAME_LEFT (buffer, buffer->__prev))
+    buffer->__prev = NULL;
   THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_DEFERRED);
   THREAD_SETMEM(self, p_cleanup, buffer);
 }

Modified: trunk/uClibc/libpthread/linuxthreads.old/internals.h
===================================================================
--- trunk/uClibc/libpthread/linuxthreads.old/internals.h	2006-11-09 00:00:12 UTC (rev 16522)
+++ trunk/uClibc/libpthread/linuxthreads.old/internals.h	2006-11-09 08:07:43 UTC (rev 16523)
@@ -24,6 +24,7 @@
 #include <setjmp.h>
 #include <signal.h>
 #include <unistd.h>
+#include <bits/stackinfo.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include "pt-machine.h"




More information about the uClibc-cvs mailing list