summaryrefslogtreecommitdiff
path: root/debian/patches/libpthread_pthreadexit-safety.patch
blob: 7a56f6e7b691fc5586c4000618645a013654838b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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);