From f7dfb7453d8c0a66ba0de0446d1dcfc5afc29118 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Thu, 9 Nov 2006 08:14:00 +0000 Subject: prevent cancellation functions from being called more than once --- libpthread/linuxthreads.old/join.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'libpthread') diff --git a/libpthread/linuxthreads.old/join.c b/libpthread/linuxthreads.old/join.c index f249a8114..4bdc77a25 100644 --- a/libpthread/linuxthreads.old/join.c +++ b/libpthread/linuxthreads.old/join.c @@ -37,9 +37,13 @@ void __pthread_do_exit(void *retval, char *currentframe) struct pthread_request request; PDEBUG("self=%p, pid=%d\n", self, self->p_pid); - /* Reset the cancellation flag to avoid looping if the cleanup handlers - contain cancellation points */ - THREAD_SETMEM(self, p_canceled, 0); + /* obey POSIX behavior and prevent cancellation functions from + * being called more than once. + * http://sourceware.org/ml/libc-ports/2006-10/msg00043.html + */ + THREAD_SETMEM(self, p_cancelstate, PTHREAD_CANCEL_DISABLE); + THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_DEFERRED); + /* Call cleanup functions and destroy the thread-specific data */ __pthread_perform_cleanup(currentframe); __pthread_destroy_specifics(); -- cgit v1.2.3