summaryrefslogtreecommitdiff
path: root/debian/patches/libpthread_pthreadexit-safety.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/libpthread_pthreadexit-safety.patch')
-rw-r--r--debian/patches/libpthread_pthreadexit-safety.patch37
1 files changed, 37 insertions, 0 deletions
diff --git a/debian/patches/libpthread_pthreadexit-safety.patch b/debian/patches/libpthread_pthreadexit-safety.patch
new file mode 100644
index 00000000..7a56f6e7
--- /dev/null
+++ b/debian/patches/libpthread_pthreadexit-safety.patch
@@ -0,0 +1,37 @@
+As documented in pthread_exit(), the joiner has to make sure the thread really
+is dead before freeing its stack.
+
+Index: libpthread/pthread/pt-detach.c
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-detach.c,v
+retrieving revision 1.2
+diff -u -p -r1.2 pt-detach.c
+--- libpthread/pthread/pt-detach.c 4 May 2005 16:04:06 -0000 1.2
++++ libpthread/pthread/pt-detach.c 8 Jul 2008 23:25:07 -0000
+@@ -58,6 +58,9 @@ pthread_detach (pthread_t thread)
+
+ __pthread_mutex_unlock (&pthread->state_lock);
+
++ /* Make sure that the kernel thread is dead. */
++ __thread_terminate (pthread->kernel_thread);
++
+ assert (pthread->stack);
+ __pthread_stack_dealloc (pthread->stackaddr, pthread->stacksize);
+ pthread->stack = 0;
+Index: libpthread/pthread/pt-join.c
+===================================================================
+RCS file: /cvsroot/hurd/hurd/libpthread/pthread/pt-join.c,v
+retrieving revision 1.1
+diff -u -p -r1.1 pt-join.c
+--- libpthread/pthread/pt-join.c 10 Oct 2002 23:05:06 -0000 1.1
++++ libpthread/pthread/pt-join.c 8 Jul 2008 23:25:07 -0000
+@@ -53,6 +53,9 @@ pthread_join (pthread_t thread, void **s
+ if (status)
+ *status = pthread->status;
+
++ /* Make sure that the kernel thread is dead. */
++ __thread_terminate (pthread->kernel_thread);
++
+ /* Make sure nobody can reference it anymore, and mark it as
+ terminated. */
+ assert (pthread->stack);