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